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

原文地址:https://www.cnblogs.com/striver20/p/12785494.html