bash脚本编程class3

bash脚本编程class3—函数定义与数组使用相关

    一.函数的使用以及数组的定义

  我们通过学习知道,当编辑一个shell脚本的时候,可以在这个shell脚本中调用其他的shell脚本来实现特定的功能。在实际工作环境中,用很多shell实现的功能是我们常常使用到的,如果一次一次的调用这些shell脚本会显得非常麻烦。这时,函数的作用就体现出来了。其实函数就是一个被定义并命名的常用shell脚本,所有函数都集中放在一个配置文件中,当用户使用的时候,只需要调用这个文件内容,就可以根据其中每个函数名称来使用。比如如果我们在/etc/functions这个文件写入了很多函数,如果想要在一个脚本中使用这些函数,只需要在脚本中调用/etc/functions这个文件,就可以使用这些函数了。

  

  1.函数的定义方式

  函数的定义方式有三种:

  function  函数名() { ;函数内容 ;}

  函数名 () { ;函数内容 ;}

  function 函数名 { ;函数内容 ;}

filejudge () {
[ ! -e $1 ]&&echo "meiwenjian"&& exit
if [[ -f $1 ]]
    then
    echo "This is a ordinary file"
elif [[ -d $1 ]]
    then
    echo "This is a directory"
elif [[ -h $1 ]]
    then
    echo "This is a link file"
else
    echo "This is an other file type"
fi
}

 上面使用的就是第二种函数命名方式,这个函数体实现的功能为辨别文件的类型。

  2.载入函数以及检验载入函数

  当我们在一个shell文件中编译好了一系列的函数之后,如何使用这些函数呢?这里需要使用source或者.命令,这样可以使函数文件的内容立即生效。使用set命令可以查看当前系统中定义的所有函数。如果想取消某些函数的使用,使用unset 函数名,就可以取消这个函数的使用。载入函数以后,直接使用函数名[后加参数],就可以实现函数功能了。

  3.函数的返回值以及局部变量

  在执行一个命令之后,echo $?可以显示命令的成功与否。而函数大多是由多条命令组成的,正常情况下,当用户鉴定函数体是否执行成功时,是根据函数中最后一条命令的成功与否来判断的。如果想要定义返回值,使用return后接数字来实现。return 0表示成功,return1 1-255表示有错误返回值。同样使用echo命令来显示。return的好处是可以根据返回状态值进行条件选择执行不同分支的命令,从而使函数应用性更强。

  在函数中可以定义变量,可以定义本地变量与环境变量。但是如果用户只想要在函数中使用这个变量,执行函数完成后不想让这个变量在当前shell中继续使用,防止与同名变量冲突。这该怎么办呢?Linux的有一种变量可以达到这个卸磨杀驴的效果,就是局部变量,这个变量只能在函数中定义,只能在函数体中使用,执行完函数体就没效果了。使用local name=变量名,来定义。比如:

#!/bin/bash
name=dafei
xxx () {
   local name=xiaowangba
}
echo $name

 上述我们写一个函数的脚本,先定义变量name=dafei,然后在函数体内定义局部变量name=xiaowangba,在函数外执行name变量显示。如果执行这个脚本,你猜name会是什么?

[root@localhost bin]# bash funstest.sh
dafei

 当然是dafei。

  4.函数递归以及其使用实例

  函数递归说白了就是函数自己调用自己,前提是此函数可以使用的情况下。应用这种递归方式,可以实现一些规律性的数据计算。比如 Fn = Fn-1 + Fn-2。如果想计算Fn的值,需要如下函数递归:

goldrabbit () {
  if [ $1 -eq 1 ];then
     echo 0
  elif [ $1 -eq 2 -o $1 -eq 3 ];then
     echo 1
  else
     echo $[$(goldrabbit $[$1-1])+$(goldrabbit $[$1-2])]
  fi
}

 goldrabbit为函数名,根据数列规律我们得知:F3=F2+F1=1,F2=F3=1,F1=0。F4=F2+F3=2…这样就可以得知Fn的值了。

    二.数组定义以及字符串处理

  

  1.数组的定义

  之前所学的变量每一次赋值都是单个数字或者字符串,如果想要一次赋值多个变量,就需要数组的概念了。使用name=(若干变量…)。定义name为一个数组。

  使用数组之前一般需要declare -a name声明数组。变量分割符为空格,默认从name[0]到name[n-1]。比如:

[root@localhost ~]# baobao=(xx yy zz aa bb)
[root@localhost ~]# echo ${baobao[1]}
yy

 如上这里为变量baobao定义一个数组,显示baobao[1],结果为数组中的第二个变量yy。

 有些时候数组的排序不适用0到n-1,使用a,b,c..也是可以的,但是前面一定要声明declare -A。比如:

[root@localhost ~]# declare -A baobao
[root@localhost ~]# baobao=([a]=aa [b]=bb [c]=cc [d]=dd)
[root@localhost ~]# echo ${baobao[b]}
bb

 这里可以看到数组变量的排序不是0到n-1了,而是a,b,c,d。这就是关联数组declare -A的作用。

  2.数组变量的修改

  实现数组内容的增删查改:只能追增,根据编号顺序追增,如果编号顺序重复则覆盖。删,使用unset name[number]删除编号的内容。查,echo ${name[*]}显示所有变量,echo ${#name[*]}显示数组中变量个数。上例子:

[root@localhost ~]# declare -a baobao
[root@localhost ~]# baobao=(aa bb cc dd ee)
[root@localhost ~]# echo ${#baobao[*]}
5
[root@localhost ~]# echo ${baobao[*]}
aa bb cc dd ee
[root@localhost ~]# baobao[6]=xx
[root@localhost ~]# echo ${baobao[*]}
aa bb cc dd ee xx
[root@localhost ~]# unset baobao[0]
[root@localhost ~]# echo ${baobao[*]}
bb cc dd ee xx

 增删查改baobao。

  也可以使用${baobao[*]:1:3}表示去掉前一个(按编号),然后接着取3个(按编号)baobao数组的变量:

echo ${baobao[*]:1:3}
bb cc dd

  由于baobao[0]被删除了,所以越过baobao[0]取接下来的baobao[1],baobao[2],baobao[3],于是得到bb cc dd

例题:使用冒泡排序法找出10个随机数的最大值

[root@localhost bin]# cat funstest.sh
#!/bin/bash
for i in `seq 0 9`;do
    ran[$i]=$RANDOM
    if [ $i -eq 0 ];then
       max=${ran[$i]}
    elif [ ${ran[$i]} -gt ${ran[$[$i-1]]} ];then
       max=${ran[$i]}
    fi
done
echo ${ran[@]}
echo "max: $max"
    

[root@localhost bin]# bash funstest.sh
3232 5655 22990 30240 28066 15611 11885 7793 15777 13386
max: 15777

  使用数组,非常简单。

  3.字符串处理

  这里指的字符串处理是bash自带功能的字符串处理,而不是通过cut命令之类的,同时字符串一般是由一个变量代表的。比如:

[root@localhost ~]# baobao=aaadfjaojsfpajfiqfkangiuowang
[root@localhost ~]# echo ${baobao:3}
dfjaojsfpajfiqfkangiuowang
[root@localhost ~]# echo ${baobao:3:2}
df

  上述命令,第一个表示取baobao去掉前三个字符的字符串内容,后一个表示去掉前三个接着只取后续的两个字符。

[root@localhost bin]# echo $baobao 
aaadfjaojsfpajfiqfkangiuowang
[root@localhost bin]# echo ${baobao#*js}
fpajfiqfkangiuowang
[root@localhost bin]# echo ${baobao%js*}
aaadfjao

  上述命令#,%分别代表选取字符串的特定内容,#表示从左向右找到js以及js右侧的内容,%表示从右向左找到js以及js左侧的内容,这里#,%后面的word表示第一次找到的word,如果换成##,%%就会变成最后一次找到的word

[root@localhost bin]# baobao=dadsbabagwegwjkhwoibabakjrgjwp
[root@localhost bin]# echo ${baobao##*baba}
kjrgjwp
[root@localhost bin]# echo ${baobao%%*baba}
dadsbabagwegwjkhwoibabakjrgjwp

 如上所述。

  最后介绍转换字符串大小写的方法:

[root@localhost bin]# baobao=dadsbabagwegwjkhwoibabakjrgjwp
[root@localhost bin]# echo ${baobao^^} 
DADSBABAGWEGWJKHWOIBABAKJRGJWP

[root@localhost bin]# xx=`echo ${baobao^^}`
[root@localhost bin]# echo $xx
DADSBABAGWEGWJKHWOIBABAKJRGJWP
[root@localhost bin]# echo ${xx,,}
dadsbabagwegwjkhwoibabakjrgjwp

  懂没?不懂再学。

原创文章,作者:mcgeewang,如若转载,请注明出处:http://www.178linux.com/39242

(0)
mcgeewangmcgeewang
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • httpd 安装配置

    web 服务介绍 web服务时一种应用程序的服务,它所提供的最主要的信息是一种超文本标记语言(HTML)、多媒体资源(如:视频、图片、音乐等)。HTML是一种纯文字的文本信息,通过所谓的标签来规范所要显示的内容格式,在客户端通过浏览器的形式对HTML及多媒体资源进行解析,然后呈现在终端上。主要由http和https协议实现 http协议 HTTP是一个属于应…

    Linux干货 2016-11-01
  • OpenSSH

    ssh: secure shell, protocol, 22/tcp, 安全的远程登录 OpenSSH: ssh协议的开源实现; dropbear:另一个开源实现;  SSH协议版本 v1: 基于CRC-32做MAC,不安全;man-in-middle v2:双方主机协议选择安全的MAC方式 基于DH算法做密钥交换,基于RSA或DSA算法实现身份…

    Linux干货 2015-06-21
  • N21_第7周_磁盘及文件系统管理

    N21_第7周_磁盘及文件系统管理 作业题目: 1、创建一个10G分区,并格式为ext4文件系统;    (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳…

    Linux干货 2016-09-26
  • 人志建,则无敌—if、case练习

    马哥21期网络班-9周博客作业 1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash for i in `cut -d: -f7 /etc/passwd`;&…

    Linux干货 2016-09-05
  • linux下的文件查找命令对比(locate,find,grep,sed)

        在linux下,文件系统占据着非常重要的位置,而我们对于文件系统的操作也显得尤为重要。 如果我们想熟悉的操作文件系统,其中,我们需要对文本的查找,截取等命令需要熟悉的掌握。 这里就不得不说几个关于文本操作的几个命令的作用详细介绍和对比。比如: locate,find ,grep ,sed等。 这里,grep ,…

    Linux干货 2016-08-15
  • 廉价磁盘阵列(RAID)与逻辑卷(lvm)

    RAID的作用介绍与LVM的创建分析   有计算机基础常识的人们都能了解,现如今生产出来的存储设备比如机械式磁盘,作为个体它的存储容量是有上限的,虽然曾经有人开发出大容量磁盘,但是成本太高,无法在社会中普及应用。对于这种大型服务器系统迫切需要的功能,催生出了一个叫做廉价冗余磁盘阵列的技术,歪果仁将它称为RAID。而后随着岁月的发展,又产生了逻辑卷l…

    Linux干货 2016-09-11

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-25 13:29

    文章整体思路清晰,shell脚本函数和数组定义理解透彻,看完博客给人一中概览性的认识,整篇博客让人能看到很多专业性所在,还能看出很用心的地方,革命尚未成功,同志仍需努力啊,加油!