shell编程之case语句与for循环语句
case分支语句
case语句可以使脚本程序的结构更加清晰,层次分明。
case语句的结构:
适用情况:某个变量存在多种取值,对每种取值执行不同的命令序列。与if相识,不过if是判断不同的条件,而case是判断一个变量的不同取值。
case语句格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
....
*)
默认命令序列
esac
case执行流程:
首相使用“变量值”与模式1进行比较,若取值相同则执行模式1后面的命令序列,遇到“;;”后跳转esac,表示结束分支;若与模式1不匹配,则继续执行模式2进行比较,若取值相同则执行模式2后的命令序列,依次类推;若找不到任何匹配的值,则执行默认模式*)后的命令序列
case分支语句使用注意项:
case行尾必须为单词“in”,每一模式必须以右括号“)”结束
双分号“;;”表示命令序列的结束
模式字符串中,使用方括号“[ ]”表示连续范围,还以使用“|”表或
最后的“)”表示默认模式,“”表示通配符
**实例:检查用户输入的字符类型的 shell脚本**
[root@localhost ~]# vim susu.sh
#!/bin/bash
read -p "请输入一个字符,并回车键确认:" LLL
case "$LLL" in
[a-z]|[A-Z])
echo "你输入的是字母$LLL!"
;;
[1-9])
echo "你输入的是数字$LLL!"
;;
*)
echo "请输入字母或数字"
;;
esac
for循环语句
适用于列表对象无规律,且来源已固定(如某个列表文件)
for语句的结构:
需要指定一个变量及可能的取值列表,不同的取值执行相同的命令序列,直到变量值用完才退出循环。
for语句格式:
for 变量名 in 取值列表
do
命令序列
done
for语句的执行流程:
首相将取值列表第1个值赋予给变量,并执行do···done循环体中的命令序列;然后再将第2个值赋予给变量,并执行循环体中的命令序列;以此类推直到取值列表取值用完退出for循环
实例:根据IP地址列出主机状态
[root@localhost ~]# vim dats.sh
#!/bin/bash
HIHI=$(cat /root/dats.txt) //创建并指定变量名
for IP in $HIHI //指定变量名和取值列表
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] //执行是否成立
Then //成立执行的命令序列
echo "up"
Else //执行不成立
echo "down" //不成立执行的命令序列
fi
done
If ,for以及其他shell脚本语句,都可以嵌套使用
while循环语句
适用于控制循环次数,操作对象按数字编号,按特定条件执行重复操作等。
while语句的结构:
根据特定的条件反复执行一个命令序列,直到该条件不再满足为止。应避免死循环,否则后面的命令操作无法执行
while循环语句格式:
while 条件测试操作
do
命令序列
done
While语句的执行流程:
首先判断while后的条件测试结果,如果条件成立,则执行do···循环体中的命令序列,然后返会while再次判断条件测试结果,直到不成立才结束循环。while语句中有两个特殊的条件特使操作:true(真)和false(假)。表示条件成立或不成立,同样也可以使用到if语句中
实例:猜价格游戏
[root@localhost ~]# vim bb.sh
#!/bin/bash
POPO=$(expr $RANDOM / 100) //一种特殊的算法
OPOP=0 //对应let使用
echo "猜猜我心中的数字是多少0~999!"
while true //true表示真,成立do
read -p "我心中的数字是多少呢?" NIMA
let OPOP++ //每循环+1
if [ $NIMA -eq $POPO ] ; then
echo "恭喜你答对了!我心中的数字是$NIMA"
echo "你总共猜了$OPOP次"
exit 0 //成立则退出
elif [ $NIMA -gt $POPO ] ; then
echo "太高了"
else
echo "太低了"
fi
done