shell脚本之两位大哥!!——函数 !数组! 超细

shell大哥 函数

Shell函数
■将命令序列按格式写在一起
■可方便重复使用命令序列
■Shell函数定义

●使用return或exit可以显式地结束函数
●function可以直接省略
●return表示退出函数后返回一个退出值

            function      函数名() {
                                       
                           命令序列

                          [return x]

           }

调用函数的方法
函数名 [参数1] [参数2]

◆函数应用示例

两个数字求和
◆通过sum ()定义函数
◆使用read命令交互输入两个数并求和

[root@localhost hanshu]# vi 1.sh
sum() {
read -p "输入第一个数字:" A
read -p "输入第二个数字:" B
echo "你输入的数字分别为: $A $B"
S=$[ $A + $B ]
echo "两个数的和为:$S"
}
sum 
[root@localhost hanshu]# chmod +x 1.sh 
[root@localhost hanshu]# ./1.sh 
输入第一个数字:10
输入第二个数字:20
你输入的数字分别为: 10 20
两个数的和为:30

◆函数变量的作用范围

●在shell脚本中函数的执行并不会开启一个新的子shell,而是仅在当前定义的shell环境中有效

●如果shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的,在编写脚本时有时需要将变量的值限定在函数内部,可以通过内置命令 local 来实现函数内部变量的使用,可以便面函数内外同时出现同名变量对脚本的影响

●来看一下local命令使用

[root@localhost hanshu]# vi 2.sh              
myfun () {
        local i
        i=8
        echo "$i"
}
i=9
myfun
echo $i

[root@localhost hanshu]# bash 2.sh        
8
9

◆函数的参数

函数名称 参数1 参数2 参数3

●这里的参数就是位置参数

●函数名和参数之间用空格分隔,可以有多个参数,参数使用$1,$2…的方式表达一次类推

●从第10个参数开始,调用方法为${10},不加大括号无法调用


列如
[root@localhost hanshu]# vi 3.sh
#!/bin/bash
mydir="/date"
out="$mydir/my.log"
[ -e $mydir ] || mkdir -p $mydir

app() {
 echo "$2">>"$1"
}
app $out "first one two"
app $out "two three four five"

[root@localhost hanshu]# chmod +x 3.sh
[root@localhost hanshu]# ./3.sh
[root@localhost hanshu]# cat /date/my.log 
first one two
two three four five

◆递归函数

●在Linux系统上编写shell的时候,经常需要递归遍历系统的目录,并列出目录下的文件和目录
逐层递归列出,并对这些层级关系进行展示

[root@localhost hanshu]# vi 4.sh
list() {
 for f in `ls $1`;
 do
   if [ -d "$1/$f" ]
   then
     echo "$2$f"
     list "$1/$f" "  $2"
   else
     echo "$2$f"
   fi
 done
}
list "/var/log" ""

[root@localhost hanshu]# bash 4dg.sh 
anaconda
  anaconda.log
  .......
  X.log
audit
  audit.log
boot.log
boot.log-20200820
.....

shell二哥 数组

■应用场景包括

●获取数组长度

●获取元素长度

●遍历元素

●元素切片

●元素替换

●元素删除

◆数组的四种定义方法

常用第一种方法
■方法1

A=1 2 3 4 5

■方法2

 A=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)

■方法3

B="1 2 3 4 5"
A=$B

■方法4

A[0]=1
A[1]=2
A[2]=3
A[3]=4
A[4]=5

◆获取数组长度

[root@localhost hanshu]# A=(1 2 3 4 5)
[root@localhost hanshu]# B=${#A[*]}
[root@localhost hanshu]# echo $B
5
[root@localhost hanshu]# echo ${#A[*]}
5
[root@localhost hanshu]# echo ${#A[@]}
5
*和@ 一个意思

◆读取某下标赋值

[root@localhost hanshu]# A=(1 2 3 4 5)
[root@localhost hanshu]# C=${A[2]}
[root@localhost hanshu]# echo $C
3
[root@localhost hanshu]# C=${A[0]}
[root@localhost hanshu]# echo $C  
1
数组可以用位置参数来读取 从$0开始
$0=1
$1=2    以此类推

◆获取数组全部元素

[root@localhost shuzu]# A=(2 3 5 7 9)
[root@localhost shuzu]# echo ${A[*]}
2 3 5 7 9

◆数组遍历

[root@localhost shuzu]# vi 1.sh
A=(1 2 3 4 5)
for i in ${A[*]}
do  
  echo "$i"
done
[root@localhost shuzu]# bash 1.sh 
1
2
3
4
5

◆数组切片

[root@localhost shuzu]# A=(1 2 3 4 5)

${数组名[*或者@]:起始位置(位置参数从$0开始):长度}
[root@localhost shuzu]# echo ${A[@]:0:2}
1 2

[root@localhost shuzu]# echo ${A[@]:2:3}
3 4 5

◆数组替换

[root@localhost shuzu]# A=(1 2 3 4 5)

${数组名[@或*]/查找字符(从$0开始)/替换字符}
[root@localhost shuzu]# echo ${A[*]/4/500}
1 2 3 500 5
[root@localhost shuzu]# echo ${A[*]} 并不会替换数组原有内容
1 2 3 4 5
[root@localhost shuzu]# A=(${A[*]/4/500})  要改变原有数组,可通过重新赋值实现
[root@localhost shuzu]# echo ${A[*]}  
1 2 3 500 5

◆删除数组 unset命令


全部删除
[root@localhost shuzu]# A=(1 2 3 4 5)     
[root@localhost shuzu]# unset A
[root@localhost shuzu]# echo ${A[*]}


也可以删除具体的某个元素
[root@localhost shuzu]# A=(1 2 3 4 5)
[root@localhost shuzu]# unset A[2]
[root@localhost shuzu]# echo ${A[*]} 
1 2 4 5

猜你喜欢

转载自blog.csdn.net/weixin_48190891/article/details/108241933
今日推荐