目录
shell函数
格式
函数名 [参数1] [参数2]
特殊$符号意思
- $0:是脚本本身的名字;
- $#:是传给脚本的参数个数;
- $@:是传给脚本的所有参数的列表,即被扩展为"$1" “$2” “$3"等;
- $*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成”$1c$2c$3",其中c是IFS的第一个字符;
- $$:是脚本运行的当前进程ID号;
- $?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;
定义方法
- 方法一:数组名=(value0 value1 value2 …)
- 方法二:数组名=([0]=value [1]=value [2]=value … )[ ]:下标
- 方法三:列表名=“value0 value1 value2 … ”
数组名=($列表名) - 方法四:数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
示例
数组长度与下标
[root@server2 ~]# b=(1 2 3 4 5 )
[root@server2 ~]# echo ${#b[*]}
5
[root@server2 ~]# echo ${#b[@]}
5
[root@server2 ~]# echo ${b[0]}
1
[root@server2 ~]# echo ${b[4]}
5
[root@server2 ~]# echo ${b[@]}
1 2 3 4 5
c=([0]=10 [1]=20 [2]=30)
[root@server2 ~]# echo ${#c[@]}
3
[root@server2 ~]# echo ${c[0]}
10
[root@server2 ~]# echo ${c[2]}
30
[root@server2 ~]# echo ${c[*]}
10 20 30
数组的替换
[root@server2 ~]# b=(1 2 3 4 5 )
[root@server2 ~]# echo ${b[@]/3/33} (在输出时替换,本质未变)
1 2 33 4 5
[root@server2 ~]# echo ${b[@]}
1 2 3 4 5
[root@server2 ~]# b=${b[@]/3/33} (改变本源)
[root@server2 ~]# echo $b
1 2 33 4 5
数组的删除
[root@server2 ~]# unset b
[root@server2 ~]# echo ${b[@]}
递归函数
调用自己本身的函数
function sum(){
s=`sum`
}
递归遍历目录
function list_files(){
for f in `ls $1`
do
#判断是否为目录
if [ -d "$1/$f" ];then
echo "$2$f"
#递归调用
list_files "$1/$f" " $2"
else
echo "$2$f"
fi
done
}
list_files "/var/log" ""
Shell脚本计算10的阶乘10
#!/bin/sh
factorial=1
for a in `seq 1 10 `
do
factorial=`expr $factorial\*$a`
done
echo "10! = $factorial"
Shell脚本调试
bash命令
命令格式
- sh [-nvx] 脚本名
常用选项
-n,-v,-x
- -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提醒报错。
- -v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
- -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。
set命令
- set -x:开启调节模式
- set +x:关闭调节模式
项目示例
[root@server2 ~]# vi grade1.sh
#!/bin/bash
set -x //开启调试模式
read -p "请输入你的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo "$GRADE 分!优秀" set +x //关闭调试模式
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,合格" else
echo "$GRADE 分?不合格"
fi
[root@server2 ~]# chmod +x grade1.sh
[root@server2 ~]# ./grade1.sh