case语法格式:

格式 :

case 变量名 in

​ value1)

​ command

​ ;;

​ value2)

​ command

​ ;;

​ *)

​ commond

​ ;;

esac

在case程序中,可以在条件中使用|,表示或的意思, 比如

2|3)

​ command

​ ;;

img

案例:

[root@jinkai01 shell]# cat o.sh

#!/bin/bash

read -p "Please input a number: " n

if [ -z "$n" ]

then

echo "Please input a number."

exit 1

fi

n1=echo $n|sed 's/[0-9]//g'

if [ -n "$n1" ]

then

echo "Please input a number."

exit 1

fi

if [ $n -lt 60 ] && [ $n -ge 0 ]

then

tag=1

elif [ $n -ge 60 ] && [ $n -lt 80 ]

then

tag=2

elif [ $n -ge 80 ] && [ $n -lt 90 ]

then

tag=3

elif [ $n -ge 90 ] && [ $n -le 100 ]

then

tag=4

else

tag=0

fi

case $tag in

​ echo "not ok"

​ ;;

​ echo "ok"

​ ;;

​ echo "ook"

​ ;;

​ echo "oook"

​ ;;

*)

​ echo "The number range is 0-100."

​ ;;

esac

for循环

for语法格式:

for 变量 in 参数列表

do

命令

done

img

实例:

参数列表还可以从命令中取值

seq命令获取两个数以及之间的所有整数

[root@jinkai01 shell]# cat a.sh

#/bin/bash

for i in seq 1 4

do

echo $i

done

[root@jinkai01 shell]# sh a.sh

1

2

3

4

参数列表还可以从变量中读取,可以是多个变量

[root@jinkai01 shell]# cat c.sh

#!/bin/bash

a1="hahaha"

a2="hohoho"

for var in $a1 $a2

do

echo $var

done

[root@jinkai01 shell]# sh c.sh

hahaha

Hohoho

变量赋值可以放在for循环外部定义,一次循环完成后执行的操作可以放在循环里面。

[root@jinkai01 shell]# cat e.sh

#!/bin/bash

i=0

for ((;i<=10;)) ; do

echo "Num is $i"

let i++

done

[root@jinkai01 shell]# sh e.sh

Num is 0

Num is 1

Num is 2

Num is 3

Num is 4

Num is 5

Num is 6

Num is 7

Num is 8

Num is 9

Num is 10

While循环

while****语法格式:

while 判断条件

do

命令

done

img

实例:

[root@jinkai01 shell]# cat f.sh

#!/bin/bash

i=0

while [ $i -lt 10 ] #如果小于10,则执行循环

do

echo $i

i=$[i+1]

done

[root@jinkai01 shell]# sh f.sh

1

2

3

4

5

6

7

8

9

实例2:

[root@jinkai01 shell]# cat g.sh

#!/bin/bash

while :

do

load=w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1

if [ $load -gt 10 ] //根据上述命令结果赋值,大于10则继续执行

then

​ top|mail -s "load is high: $load" asldkfls@11.com

fi

sleep 30 //上述结果不大于10,则执行下面的条件

done

[root@jinkai01 shell]# sh -x g.sh

+ :

++ head -1

++ awk -F 'load average: ' '{print $2}'

++ cut -d. -f1

++ w

+ load=0

+ '[' 0 -gt 10 ']'

+ sleep 30

实例3:

[root@jinkai01 shell]# cat i.sh

#!/bin/bash

while :

do

read -p "Please input a number: " n

if [ -z "$n" ] //判断是否为空

then

​ echo "you need input sth."

​ continue //如果不为空,跳过本次循环

fi

n1=echo $n|sed 's/[0-9]//g' //上面已经判断不为空,过滤数字后,如果不为空,则继续循环

if [ -n "$n1" ]

then

​ echo "you just only input numbers."

​ continue

fi

break //上述两个条件判断n为数字,循环结束,跳出本次循环

done

echo $n //打印出数字n

break,continue和exit

在使用while或for循环语句过程中,也许碰到某个特殊条件,我们需要跳过当次循环或整个循环或结束脚本,这是就需要借助break,continue和exit。

break跳出循环:

[root@jinkai01 shell]# cat j.sh

#!/bin/bash

for i in seq 1 5

do

if [ $i == 3 ]

then

​ break

fi

echo $i

done

echo aaaaaaa

[root@jinkai01 shell]# sh j.sh

1

2

aaaaaaa

$i 由数字1到5依次赋值,赋值为1和2,条件不成立,则echo $i输出$i;赋值为3,条件成立,跳出本次循环不在进行后续循环,输出值为 echo aaaaaaa

continue跳过(结束)本次循环:

忽略continue之下的代码,直接进行下一次循环

[root@jinkai01 shell]# cat k.sh

#!/bin/bash

for i in seq 1 5

do

if [ $i == 3 ]

then

​ continue

fi

echo $i

done

echo $i

[root@jinkai01 shell]# sh k.sh

1

2

4

5

5

$i由数字1--5依次赋值,赋值为1,2时条件不成立,无法跳过循环,输出值为 echo $i ;赋值为3时,条件成立,跳过本次循环且下面不执行,因为后续还有数字,继续重头开始循环,一直到数字匹配结束

exit直接退出脚本:

[root@jinkai01 shell]# cat l.sh

#!/bin/bash

for i in seq 1 5

do

if [ $i == 3 ]

then

​ exit

fi

echo $i

done

echo aaaaaaa

[root@jinkai01 shell]# sh l.sh

1

2

$i由数字1--5一次赋值,数字1,2条件不成立,输出值echo $i;数值为3时条件成立,exit直接退出了脚本,后续都不执行了。

Shell 脚本中函数的使用

函数是一个脚本代码块,你可以对它进行自定义命名,并且可以在脚本中任意位置使用这个函数。如果想要这个函数,只要调用这个函数的名称就可以了。使用函数的好处在于模块化以及代码可读性强。

函数的创建语法

函数的创建方法一:

function 函数名称 {

命令

}

函数的创建方法二:

函数名称() {

命令

}

注意:函数名称在当前脚本必须唯一,函数必须要放在最前面。

调用函数的方法:

函数名称 参数1 参数2 ......

调用函数时可以传递参数,函数中使用$1、$2......来引用传递的参数。

函数的使用实例:

实例1:

[root@jinkai01 shell]# cat m.sh

#!/bin/bash

function fun1 {

echo "hello world"

}

fun2() {

echo $[$1+$2]

}

fun1

fun2 1 2

[root@jinkai01 shell]# sh m.sh

hello world

3

实例2:

[root@jinkai01 shell]# cat n.sh

#!/bin/bash

ip()

{

ifconfig |grep -A1 "ens33: " |tail -1 |awk '{print $2}'

}

read -p "Please input the eth name: " e

myip=ip $e

echo "$e address is $myip"

[root@jinkai01 shell]# sh n.sh

Please input the eth name: ens33

ens33 address is 192.168.186.140

shell中的数组

定义数组:

a=(1 2 3 4 5)

echo ${a[@]} 查看数组

[root@jinkai01 shell]# echo ${a[@]}

1 2 3 4 5

echo ${#a[@]} 获取数组的元素个数

[root@jinkai01 shell]# echo ${#a[@]}

5

echo ${a[2]} 读取第三个元素,数组从0开始

[root@jinkai01 shell]#echo ${a[2]}

3

echo ${a[*]} 等同于 ${a[@]} 显示整个数组

[root@jinkai01 shell]# echo ${a[*]}

1 2 3 4 5

数组赋值:

a[1]=100; echo ${a[@]} //第二个数赋值为100,其他不变

[root@jinkai01 shell]# a[1]=100; echo ${a[@]}

1 100 3 4 5

a[5]=2; echo ${a[@]} //第6个数赋值为2,其他不变

[root@jinkai01 shell]# a[5]=2; echo ${a[@]}

1 100 3 4 5 2

[5] 是第6个数,本身是不存在的,如果目标不存在则会自动添加一个元素

数组的删除

unset a; unset a[1]

[root@jinkai01 shell]# a=(1 2 3 4 5)

[root@jinkai01 shell]# unset a[1] //删除第二个元素值

[root@jinkai01 shell]# echo ${a[1]} //查看后为空了

[root@jinkai01 shell]# echo ${a[2]} //没有删除的还可以查看到

3

[root@jinkai01 shell]# unset a //删除a对应的所有元素值

[root@jinkai01 shell]# echo ${a[@]} //查看后全部为空

数组分片

a=(seq 1 5)

echo ${a[@]:0:3} 从第一个元素开始,截取3个

[root@jinkai01 shell]# echo ${a[@]:0:3}

1 2 3

echo ${a[@]:1:4} 从第二个元素开始,截取4个

[root@jinkai01 shell]# echo ${a[@]:1:4}

2 3 4 5

echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个

[root@jinkai01 shell]# echo ${a[@]:0-3:2}

3 4

数组替换

echo ${a[@]/3/100}

a=(${a[@]/3/100})