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