什么是函数(function)?

函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。每当需要在脚本中使用这样的代码块时,只需引用该代码块被赋予的函数名称(称为调用函数);函数模块化了编程,使得脚本更加简洁。

在bash shell脚本中创建函数可以使用两种格式:

1)使用关键字function,后跟代码块的函数名:

   function f_name {

      函数体

    }

  f_name属性定义了该函数的唯一名称,脚本中自定义的每个函数都必须赋予唯一的名称。

  函数体是组成函数的一条或者多条bash shell,命令。当调用函数时,bash shell会按照各条命令在函数中出现的顺序依次执行。

2)f_name() {

      函数体

   }

  函数名之后的空白括号表明在定义函数。格式的函数命名规则与前面的shell脚本函数格式相同。

函数调用:使用函数名;函数名出现的地方,会被自动替换为函数代码;


函数的返回值有三种生成方式:

a)函数的执行结果返回值:

b)函数中使用打印语句:echo, printf

c)函数体中OS命令执行结果的输出

函数的退出状态码:

 a)默认退出状态:默认取决于函数体执行的最后一个命令的退出状态码;函数执行完毕后,可以使用标准变量$?来确定函数的退出状态。


 b)自定义退出状态码:在bash shell脚本中使用return命令以特定退出状态退出函数。return命令可以使用单个整数值来定义函数退出状态,有效取值范围为[0-255]。

#return [0-255]


注意:函数体运行时,一旦遇到return语句,函数即返回;


函数可接受参数:

  函数可以使用标准参数环境变量来表示命令行传递给函数的参数。

  传递参数给函数:调用函数时,在函数名后给出参数列表即可;例如“testfunc arg1 arg2 arg3”

  在函数体中可使用$1, $2,...来调用传递过来的各参数;可使用类似脚本的特殊变量:$*, $@: 一次性获取参数列表;$#: 参数的个数


变量的作用域:作用域是变量的可见区域,函数内定义的变量与普通变量有不同的作用域,前者能被脚本外部定义的变量所覆盖。

函数使用两种类型变量:

a)本地变量:整个脚本,在脚本的函数中也可调用,也可修改;

b)局部变量:函数调用的整个生命周期;

   命令:local VAR=VALUE;局部变量声明要使用关键字local,确保变量仅在函数内部使用。如果脚本在函数外部有不同的变量,那么shell将能区分函数变量和脚本变量。


函数递归:函数直接或间接调用函数自身;自给是局部函数变量的一个特性,自给函数除了脚本通过命令行传递的变量,不适用函数之外的任何资源;这种特性使函数能够以递归方式调用。

例如:阶乘:9!=1*2*3*4*5*6*7*8*9

使用递归可以归结为:n(n-1)!

   阶乘函数:

fact() {

    if [ $1 -eq 0 -o $1 -eq 1 ]; then

echo 1

    else

echo $[$1*$(fact $[$1-1])]

    fi

}

例如:写一个脚本,判定192.168.0.0网络内有哪些主机在线,在线的用绿色显示;不在线的用红色显示;(使用函数)

wKiom1SBJtHSY9wXAADOoziErlY247.jpg

什么是数组?

数组:连续的多个独立内存空间,每个内存空间相当于一个变量;这些变量使用相同的数组名和索引来来表示这个数组集合中的不同组成元素。

-------------------------------------注:索引是从0开始编号


声明数组:

declare -a ARRAR_NAME


关联数组:

declare -A ARRAY_NAME


--------------------------------------注:支持稀疏格式:


数组元素的赋值:

(1) 一次只赋值一个元素

ARRAY[index]=VALUE

例如:a[0]="hello"

(2) 一次赋值全部元素

ARRAY=("mon" "tue" "wed")

(3) 指定索引进行赋值

ARRAY=([0]="sun" [1]="mon" [5]="fri")

(4) read -a ARRAY

                将内容读入到数值中

引用数组元素:${ARRAY[index]}


数组的长度:

${#ARRAY[*]}, ${#ARRAY[@]}

从数组中挑选某元素:

${ARRAY[@]:offset:number}

例如:week=(mon tue wed thu fri sat sun)

       ${week[@]:3:2}结果为:thu fri


数组切片

offset: 偏移过去的元素的个数;

number: 取出的元素的个数;


取出指定偏移量之后的所有元素;

     ${ARRAY[@]:offset}

取出所有元素;

     ${ARRAY[@]}, ${ARRAY[*]}


向数组中追加元素:非稀疏格式

     例如:week, 

           week[${#week[@]}]


从数组中删除元素:

      unset ARRAY[index]


关联数组:可自定义任意字符串当作索引

例如: declare -A week

       week=([mon]="Monday" [tue]="Tuesday")

字符串操作:

字符串切片:${var:offset:lenth}

例如:a="world", ${a:2:2}, rl


取字符串最后的几个字符:${var: -lenth}

---------------注意:冒号之后有空格;


基于模式取子串:

${var#*word}:其中word可以是指定的任意字符;自左而右,查找var变量所存储字符中,第一次出现的word,删除字符开头直至第一次wrod出现处之间的所有字符;

例如:# mypath='sysconfig/network-scripts/ifcfg-eth0'

      # echo ${mypath#*/}

      network-scripts/ifcfg-eth0

${var##*word}: 其中word可以是指定的任意字符;自左而右,查找var变量所存储字符中,最后一次出现的word,删除字符开头直至最后一次wrod出现处之间的所有字符;

      # mypath='/sysconfig/network-scripts/ifcfg-eth0'

      # echo ${mypath##*/}

      ifcfg-eth0


${var%word*}: 自右而左,删除第一次word出现处的字符开始直到尾部的所有字符;

${var%%word*}:自右而左,删除最后一次word出现处的字符开始直到尾部的所有字符;


例如:url=http://www.magedu.com:80

取端口:${url##*:}

取协议:${url%%:*}


查找并替换:

${var/pattern/substi}:查找var所表示的字串中,第一次被Pattern匹配到的字串,并以substi替换之;

${var//patten/substi}:查找var所表示的字串中,所有被Pattern匹配到的字串,并以substi替换之;


${var/#pattern/substi}:以行首锚定的方式将pattern匹配至var所表示的字串上,如果能匹配,则以substi替换之;

${var/%pattern/substi}:以行尾锚定的方式将pattern匹配至var所表示的字串上,如果能匹配,则以substi替换之;

----------------注:可使用?, *元字符;


查找并删除:

${var/pattern}:删除pattern匹配到的第一次出现;

${var//pattern}: 删除pattern匹配到的所有出现;

${var/#pattern}:删除以行首锚定方式将pattern匹配至var所表示的字符串上

${var/%pattern}:删除以行尾锚定方式将pattern匹配至var所表示的字符串上


字符串大小写转换:

${var^^}:小写-->大写

${var,,}:大写-->小写


变量赋值:

${var:-word}: 如果var为空或未设置,那么返回word;否则,则返回var中的值;

${var:=word}:如果var为空或未设置,那么返回word,并且将word赋值给var;否则,返回var中的值;

${var:?err_info}:如果var为空或未设置,那么返回错误信息;否则,则返回var自身的值;

${var:+word}:如果var自身有正常数据,则返回word;


trap命令:trap命令用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。

trap 'arg' SIGNAL

例如:trap 'echo "quit"; exit 1' SIGINT


mktemp命令:产生唯一的临时文件名 

      mktemp [OPTIONS] filename.XXXXXXXX

-d: 创建临时目录

      --tmpdir=/path/to/somewhere :指定临时文件所在的目录;


install命令:增强型复制命令

install [OPTIONS] SOURCE DEST

install [OPTIONS] SOURCE... DIR

install [OPTIONS] -t DIR SOURCE...

install -d DIR   所有参数都作为目录处理,而且会创建指定目录的所有主目录

-m MODE  自行设定权限模式 (像chmod),而不是rwxr-xr-x 

        -o OWNER 自行设定所有者 (只适用于超级用户) 

        -g GROUP 自行设定所属组,而不是进程目前的所属组 

---------------注:install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户