case语法格式:
格式 :
case 变量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac
在case程序中,可以在条件中使用|,表示或的意思, 比如
2|3)
command
;;
案例:
[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
实例:
参数列表还可以从命令中取值
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
实例:
[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})