shell脚本
1、数字运算
a、expr数学运算工具
例:#aa=1
#bb=2
#cc=$(expr $aa + $bb)
b、$(())
例:#dd=$(($aa + $bb))
c、$[]
例:#ee=$[$aa + $bb]
2、运算符
/:整数相除取整
%:取余数
*:乘法
a+=b等价于a=a+b
注意:使用()可以方便的解决优先级问题
3、test语句
作用:条件判断命令
a、整数比较
-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)、-eq(等于)、-ne(不等于)
举例:#test 1 -lt 4
#echo $? -->0
等价命令:
#[ 1 -lt 4 ]
注意:"["后面一定要加空格
举例:cat eg1.sh
#!/bin/sh
if [ $1 -gt 0 ]
then
echo "$1 number is postive"
fi
b、文件测试
-f(存在且是普通文件)、-d(存在且是目录)、-s(存在且字节大于0)、-r/w/x(存在且具有指定的权限)
举例:cat eg2.sh
#!/bin/bash
if [ $# -ne 1 ]
then
echo "usage -$0 file-name"
exit 1
fi
if [ -f $1 ]
then
echo "$1 file exist"
else
echo "sorry, $1 file does not exist"
fi
c、字符串测试
举例:s="hello"
s1="world"
[ $s = $s1 ] -->判断字符串相等,假1
[ $s != $s1 ] -->判断字符串不相等,0
[ $s ] -->判断字符串非空,为0
[ -z $s ] -->判断为空,1
[ -n $s ] -->字符串长度大于0,真0
d、逻辑测试
-a
-o
!
举例:
a=1
[ $a -lt 5 -a $a -gt 0 ] -->判断a是否小于5且大于0 逻辑与 真0
[ $a -lt 0 -o $a -gt 5 ] -->判断a是否小于0或者大于5 假 假 逻辑或 假1
[ ! $a -lt 0 ] -->非 真0
4、条件分支语句
a、if
语法结构:
if 条件1 如果满足条件1
then 则
语句1 执行语句1
elif 条件2 否则,如果满足条件2
then 则
语句2 执行语句2
elif 条件3 否则,如果满足条件3
then 则
语句3 执行语句3
else 否则
语句4 执行语句4
fi 结束if判断
举例:
#!/bin/bash
if [ $# -gt 1 ]
then
echo "the number cannot bigger than 1"
exit 1
fi
if [ $# -eq 0 ]
then
ls ./
elif [ $1 = "-l" ]
then
ls -l ./
elif [ $1 = "-a" ]
then
ls -a ./
fi
注意:关键字后一定要加空格。
b、case
语法结构:
case 变量 in
值1) 语句1 ;;
值2) 语句2 ;;
.......
*) 语句n ;;
esac
举例:
#!/bin/bash
case "$#" in
0) echo "input 0 argument" ;;
1) echo "input 1 argument" ;;
*) echo "input n argument" ;;
esac
c、区别
区间判断的时候使用if语句,等值判断的时候使用case语句。
5、循环结构
a、for循环
语法结构:
for 循环变量 in 序列
do
循环语句
done
举例:
#!/bin/bash
for i in seq 1 9
do
echo expr $i \* 10
done
扩展:
seq 1 9 -->生成1,2,3,4,...,9序列
seq 9 -1 1 -->生成9,8,7,...,1序列,其中-1是步长
b、while循环
语法结构:
while 循环判断条件
do
循环语句
done
注意:只要循环判断条件为真,则一致执行循环,否则循环结束。
举例:
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
sum=$[$sum + $i]
i=$[$i + 1]
done
echo $sum
扩展:死循环,尤其是在while循环中,不要忘记迭代变量自增(自减)。但是一般在服务器中,至少会用到一个死循环。
循环嵌套:循环中嵌入了循环。
c、break和continue
break:结束整个循环;
continue:不再运行本次循环后面的语句,而直接进行下一次循环。
举例1:
echo "begin"
for i in seq 1 5
do
if [ $i -eq 3 ]
then
break
fi
echo expr $i \* 10
done
echo "end"
结果:10
20
举例2:
echo "begin"
for i in seq 1 5
do
if [ $i -eq 3 ]
then
continue
fi
echo expr $i \* 10
done
echo "end"
结果:10
20
40
50
提高:在两层嵌套循环中可以借助break 2跳出大循环;continue 2结果类似。
6、read获取用户键盘输入
注意:多个变量用空格或tab分割;个数不够,后续变量为空;个数过多,最后变量取剩余的值。
举例:
#!/bin/bash
echo "please input a b:"
read a b
for i in seq $a $b
do
echo expr $i \* 10
done
注意:一般情况下,在获取输入之前提醒用户需要输入的参数个数和格式。
7、函数
作用:将一定功能的代码块进行封装,方便代码的重复调用。
语法结构:
[function] 函数名()
{
语句1
...
}
举例1:
#!/bin/bash
hello()
{
echo "today is date
"
}
hello -->函数的调用
传参:
#!/bin/bash
fname()
{
echo $1,$2;
echo "$@";
echo "$*";
return 5;
}
printf "two arguments:"
read a b
fname $a $b
echo $? --> 显示上一句的返回结果
注意:如果不加return,默认返回0
举例2:
#!/bin/bash
fname()
{
if [ $1 -gt $2 ]
then
return 1;
elif [ $1 -lt $2 ]
then
return 2;
else
return 0;
fi
}
printf "two arguments:"
read a b
fname $a $b
case $? in
1) echo "gt" ;;
2) echo "lt" ;;
0) echo "eq" ;;
esac
8、数组
定义:
i、数组变量=(元素1 元素2 ... 元素n)
ii、数组变量[0]=元素值1
数组变量[1]=元素值2
...
数组变量[n]=元素值n
注意:数组的索引是从0开始的,最大值取到元素个数减1
举例:
#!/bin/bash
array1=(1 2 3 4 5 6)
array2[0]="first"
array2[1]="second"
array2[2]="third"
echo ${array1[0]} -->打印第一个元素值
echo ${array2[2]} -->打印第三个元素值
echo ${array1[*]} -->打印所有元素值
echo ${array2[@]} -->打印所有元素值
echo ${#array1[*]} -->获得数组的长度
遍历数组:
array3=(2 3 4 5 6 7)
for i in ${array3[@]}
do
echo $i
done