六、函数和数组

一.  函数:

1.  shell函数优势:

        1>.  把相同的程序段定义为函数,可以减少整个程序段代码量,提升开发效率。
        2>.  增加程序段可读性、易读性,提升管理效率。
        3>.  可以实现程序功能模块化,使得程序具备通用性(可移植性)。
2.  函数语法
方式1:
function 函数名 () {
        指令
        return
}
方式2:
function 函数名 {
        指令
        return
}
方式3:
函数名  ( ) {
        指令
        return
}

 3.  函数的调用:

Shell中,函数调用的基本语法如下:
function_name  param1  param2 …
在上面的语法中,function_name表示函数名称,其后面跟的param1param2…表示函数的参数。Shell的函数参数的语法比较特殊。实际上,Shell将脚本参数和函数参数做了统一地处理。也就是说,Shell采用了相同的方法来处理脚本的参数和函数参数。
1)调用函数:直接执行函数名即可。
                函数名
2)带参数的函数执行方法:
                函数名 参数
与Shell脚本一样,用户可以在Shell函数中使用位置变量来获取参数值。例如,$0表示脚本名称,$#来获取函数的参数个数,$1表示第1个参数,$2表示第2个参数等,以此类推。另外,用户还可以通过系统变量$@和$*获取所有参数的值。
4.  函数的返回值
用户可以使用return语句来返回某个数值,这与绝大部分的程序设计语言是相同的。但是,在
Shell中,return语句只能返回某个0~255之间的整数值。在函数中,用户将需要返回的数据写入到标准输(stdout),通常这个操作是使用echo语句来完成的。然后在调用程序中将函数的执行结果赋给一个变量。这种做法实际上就是命令替换的一个变种。
示例:
[root@localhost test6] # vim stringLength.sh
#!/bin/bash
length()
{
        str = $1
        result = 0
        if [ " $1 " ! = "" ];then
                result = ${#str}
        fi
        echo " $result "
}
length = $(length "abcd")
echo "the string's length is $length "
[root@localhost test6] # bash length.sh
the string 's length is 4
5.  函数库文件:
为了方便地重用这些功能,可以创建一些可重用的函数。这些函数可以单独地放在函数库文件中。
1>.  函数库文件定义:
        创建一个函数库文件的过程非常类似于编写一个Shell脚本。脚本与库文件之间的唯一区别在于函数库文件通常只包括函数,而脚本中则可以既包括函数和变量的定义,又包括可执行的代码。此处所说的可执行代码,是指位于函数外部的代码,当脚本被载入后,这些代码会立即被执行,毋需另外调用。
2>.  函数库文件的调用
        当库文件定义好之后,用户就可以在程序中载入库文件,并且调用其中的函数。在Shell中,载入库文件的命令为.,即一个圆点,其语法如下:
方式一:
.  filename  #函数库文件名
方式二:
source  filename
function_name  [  param1  param2 … ]  #调用函数的的方式仍然一样
  其中,参数filename表示库文件的名称,必须是一个合法的文件名。库文件可以使用相对路径,也
可以使用绝对路径。另外,圆点命令和库文件名之间有一个空格。  
6.  递归函数:
LinuxShell也支持函数的递归调用。也就是说,函数可以直接或者间接地调用自身。在函数的递归调用中,函数既是调用者,又是被调用者。递归函数的调用过程就是反复地调用其自身,每调用一次就进入新的一层。
示例:求据用户输入的数值计算该数的阶乘
[root@localhost test6] # vim fact.sh
#!/bin/bash
fact()
{
        local n = " $1 "
        if [ " $n " -eq 0 ]
        then
                result = 1
        else
                let "m=n-1"
                fact " $m "
                echo  "result= $n * $result "
        fi
}
fact   " $1 "  #表示将脚本的第一个参数作为函数的第一个参数传递进函数
echo "Factorial of $1 is $result "
[root@localhost test6] # bash fact.sh 0
Factorial of 0 is 1
[root@localhost test6] # bash fact.sh 5
Factorial of 5 is 120 
注意:默认情况下,除了与函数参数关联的特殊变量之外,其他所有的变量都有全局的有效范围。另外,在函数内部,如果没有使用local关键字进行修饰,那么函数中的变量也是全局变量。
示例:
[root@localhost test6] # cat variable.sh
#!/bin/bash
var = "hello world"
var2 ="haha"
func()
{
         local var = "orange"
        echo " $var "
         local var2 = "hello"
         echo " $var2 "
}
        echo " $var "
        func
        echo " $var "
        echo " $var2 "
[root@localhost test6] # bash  variable.sh
hello world
orange
hello
hello world
haha

 二.  数组:

1.  定义普通数组

        方法一:用小括号将变量值括起来赋值给数组变量,每个变量之间要用空格进行分隔。

array = (value1 value2 value3 ... )
        方法二:用小括号将变量值括起来,同时采用键值对的形式赋值。当通过键值对定义数组时,用户所提供的键值对中的元素索引不一定是连续的,可以任意指定要赋值的元素的索引。之所以可以这样操作,是因为用户已经显式指定了索引,Shell 就可以知道值和索引的对应关系。
array = ([0] = one [1] = two [2] = three ... [n] = valuen)

         方法三:分别定义数组变量的值。

array[0]=a;array[1]=b;array[2]=c

         方法四:动态的定义变量,并使用命令的输出结果作为数组的内容。

array=( $(  命令 )  )  /  array=( ` 命令 ` )

         方法五:通过declare语句定义数组。

declare -a array

 2.  定义关联数组:关联数组使用字符串作为下标( 索引 ),而不是整数,这样可以做到见名知意。不同于普通数组,关联数组必须使用带有 -A 选项的 declare 命令创建。

        方法一:一次赋一个值。

[root@localhost ~] # declare -A array
[root@localhost ~] # array[shuju1]=apple
[root@localhost ~] # array[shuju2]=banana
[root@localhost ~] # echo ${array[*]}
banana apple

        方法二:一次赋多个值

[root@localhost ~] # declare -A array
[root@localhost ~] # array=([index1]=tom  [index2]=jack  [index3]=alice)
[root@localhost ~] # echo ${array[@]}
tom jack alice

 3.  数组操作

1>.  获取所有元素:

echo ${array[*]}     # * @ 都是代表所有元素

 2>.  获取元素下标:

 echo ${!array[@]}
 echo ${!array[*]}

 3>.  获取数组长度:

echo ${#array[*]}
echo ${#array[@]}

4>.   获取第一个元素:

echo ${array[0]}

 5>.  添加元素:

 array[newIndex]=要添加的值

 6>.  添加多个元素:

array+=(值1  值2  值3)

 7>.  以切片方式获取部分数组元素:(用户得到的是一个空格隔开的多个元素值组成的字符串) 。

${array[@ | *] : start : length}

 8>.  删除第一个元素

unset array[0]   # 删除会保留元素下标

 9>.  删除数组:

unset array

 4.  遍历数组:

方法 1
#!/bin/bash
IP = (192.168.1.1 192 .168.1.2 192 .168.1.3)
for ( (i = 0 ;i< ${#IP[*]} ;i ++ )); do
        echo ${IP[$i]}   # " i "表示的是数组的索引
done
bash test.sh
192 .168.1.1
192 .168.1.2
192 .168.1.3
方法 2
#!/bin/bash
IPList = (192.168.1.1 192 .168.1.2 192 .168.1.3)
for IP in ${IPList[*]} ; do
        echo $IP    #" IP "表示的是数组的内容
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值