为何要学编程中的if、case、for、while、until命令?
作为一个运维工程师,总会听到自动化,实际自动化离不开编写shell脚本,而shell脚本中却又离不开编程中的if、case、for、while、until,
这些关键字。
了解编程中的if、case、for、while、until命令,并能熟练编写shell脚本是运维工程师的基本技能,今天要记录的是“if、case、for、while、until”简单使用。
(1)条件选择if语句
简介: 判断“条件命令”列表,如果它的判断语句为真,那么然后执行真的分支语句。否则,继续判断每个elif命令的判断语句并依次执行的,如果某个分支的判断 为真,就会执行真的分支代码,如果判断语句为假。相反执行假的分支语句。整个结构的退出状态是执行的最后一个命令的状态码。格式: if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi示例1:(单分支) if 判断条件;then 条件为真的分支代码 fi示例2:(双分支) if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi示例3:(多分支) if 判断条件1; then if-true elif 判断条件2; then if-ture elif 判断条件3; then if-ture ... else all-false fi Tips: 逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句实例1: ifping -c1 -W2 station1 &>/dev/null;then echo 'Station1 is UP' elif grep "station1" ~/maintenance.txt &> /dev/null then echo 'Station1 is undergoing maintenance‘ else echo'Station1 is unexpectedly DOWN!' exit1 fi
(2)条件判断:case语句
简介: 基于字符串匹配模式的选择地执行命令,可以用 “|”是用来分隔多个模式。格式: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac示例1: case 变量引用in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 默认分支 ;; esac 注意: case支持glob风格的通配符: *: 任意长度任意字符 ?: 任意单个字符 []:指定范围内的任意单个字符 a|b: a或b
(3)for 循环语句
简介: for命令有一个用来指明变量的特殊方法、一个必须保持成立才能继续迭代的条件,以及另一个为每个迭代改变变量的方法;依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束(执行机制)格式: for: for NAME [in WORDS ... ] ; do COMMANDS; done for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done示例1: for 变量名 in 列表;do 循环体 done 列表生成方式: (1) 直接给出列表 (2) 整数列表: (a) {start..end} (b) $(seq[start [step]] end) (3) 返回列表的命令 $(COMMAND) (4) 使用glob,如:*.sh (5) 变量引用:$@, $*
(4)while 循环语句
简介: while命令允许你定义一个要测试的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码0,它会在每个迭代的一开始测试test命令。在test命令返回 非零退出状态码时,while命令会停止执行那组命令。格式: while COMMANDS; do COMMANDS; done示例1: while CONDITION; do 循环体 done CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正(进入条件:CONDITION为true;退出条件:CONDITION为false) 示例2:创建无限循环 while true; do 循环体 done
(5)until 循环语句
简介: until命令和while命令工作的方式完全相反。until命令要求你指定一个通常输出非零推出状态码的测试命令。只要测试命令的退出状态码非零,bash shell才会执行循环 中列出的那些命令。一旦测试命令返回了退出状态码0,循环就结束了。格式: until COMMANDS; do COMMANDS; done示例1: until CONDITION; do 循环体 done 进入条件:CONDITION 为false 退出条件:CONDITION 为true 示例2:(创建无限循环) until false; do 循环体 done
(6)循环控制语句continue命令
简介: continue命令是提早结束执行循环内部的命令但并不完全终止整个循环的一个途径。它允许你在循环内部设置shell不执行命令的条件。详解: continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
(7)循环控制语句break命令
简介: bread命令是退出进行中单个的循环语句详解: break [N]:提前结束第N层循环,最内层为第1层
(8)使用read命令来接受输入
简介: read命令从键盘读取变量的值,通常用在shell脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在read命令后面, 如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]选项: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)实例1: [root@centos6 scripts]# cat read.sh #!/bin/bash # read -p "Enter in a arguments: " arg cat $arg [root@centos6 scripts]# bash read.sh Enter in a arguments: /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m [root@centos6 scripts]#
(9)作业
1、写个脚本,实现星三角
[root@centos6 scripts]# cat sanjiao.sh #!/bin/bash termCols=`tput cols` maxLineNum=`seq 1 2 $termCols | wc -l` echo "#当前终端的宽度最多能够正常打印$maxLineNum行" read -p "#请输入要打印的三角形的行数,行数范围大于1小于等于$maxLineNum,请输入行数: " lineNeeds [[ `tput cols` -ne $termCols ]] && echo "终端宽度已经被改变,请重新运行脚本" && exit [[ $lineNeeds =~ ^[[:digit:]]+$ && $lineNeeds -ge 2 && $lineNeeds -le $maxLineNum ]] [[ $? -ne 0 ]] && echo "输入值不合法" && exit for line in `seq 1 $lineNeeds`;do for ((kong=(lineNeeds-line);kong>0;kong--));do echo -n " " done for((xing=1;xing<=(line*2-1);xing++));do echo -n "*" done echo done [root@centos6 scripts]# bash sanjiao.sh #当前终端的宽度最多能够正常打印79行 #请输入要打印的三角形的行数,行数范围大于1小于等于79,请输入行数: 5 * *** ***** ******* ********* [root@centos6 scripts]#2、用until循环实现国际象棋棋盘
[root@centos6 scripts]# cat xiangqi.sh #!/bin/bash # # # i=1 until [ $i -gt 8 ];do j=1 while [ $j -le 8 ];do sum=`expr $i + $j` z=`expr $sum % 2` [ $z -eq 0 ] && echo -ne "\033[41;1m \033[0m"||echo -ne "\033[43;1m \033[0m" let j++ done echo let i++ done [root@centos6 scripts]#
原创文章,作者:Aleen,如若转载,请注明出处:http://www.178linux.com/36994