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

shell脚本

上一篇:Linux:页表中PGD、PUD、PMD等概念介绍


下一篇:Ubuntu16.04 安装eclipse