本章将带领各位去见识一下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