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/bashread -p \"请输入一个字符,并回车键确认:\" LLLcase \"$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/bashHIHI=$(cat /root/dats.txt) //创建并指定变量名for IP in $HIHI //指定变量名和取值列表doping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ] //执行是否成立Then //成立执行的命令序列echo \"up\"Else //执行不成立echo \"down\" //不成立执行的命令序列fidone
If ,for以及其他shell脚本语句,都可以嵌套使用
while循环语句
适用于控制循环次数,操作对象按数字编号,按特定条件执行重复操作等。
while语句的结构:
根据特定的条件反复执行一个命令序列,直到该条件不再满足为止。应避免死循环,否则后面的命令操作无法执行
while循环语句格式:while 条件测试操作do命令序列done
While语句的执行流程:
首先判断while后的条件测试结果,如果条件成立,则执行do···循环体中的命令序列,然后返会while再次判断条件测试结果,直到不成立才结束循环。while语句中有两个特殊的条件特使操作:true(真)和false(假)。表示条件成立或不成立,同样也可以使用到if语句中
实例:猜价格游戏[root@localhost ~]# vim bb.sh#!/bin/bashPOPO=$(expr $RANDOM / 100) //一种特殊的算法OPOP=0 //对应let使用echo \"猜猜我心中的数字是多少0~999!\"while true //true表示真,成立doread -p \"我心中的数字是多少呢?\" NIMAlet OPOP++ //每循环+1if [ $NIMA -eq $POPO ] ; thenecho \"恭喜你答对了!我心中的数字是$NIMA\"echo \"你总共猜了$OPOP次\"exit 0 //成立则退出elif [ $NIMA -gt $POPO ] ; thenecho \"太高了\"elseecho \"太低了\"fidone