Shell脚本编程中的if、case、for、while、until命令

为何要学编程中的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

(0)
AleenAleen
上一篇 2016-08-19 16:46
下一篇 2016-08-20 15:38

相关推荐

  • 主从模型的ipvs高可用集群实验

    主从模型的ipvs高可用集群实验 一.实验拓图 二.实验环境 本实验是keepalived+lvs-dr的高可用负载均衡实验 本实验是在虚拟机上完成,因此如上拓扑图需要准备至少四台虚拟机 1.各节点的时间同步 使用yum安装chrony包,使用nat命令同步时间 2.关闭服务主机的iptables和selinux 三.实验步骤: 1.在VS1和VS1上安装k…

    2017-05-17
  • 第四周作业(正则表达式)

    grep: Global search REgular expression and Print out the line.         作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;    &…

    Linux干货 2016-12-28
  • 磁盘阵列(raid),划分逻辑卷(lvm)

    磁盘阵列(raid),划分逻辑卷(lvm)       将来我们在生产环境中由于磁盘的来回读写量比较大,所以就容易导致磁盘的损坏率比较高。但是,处于生产环境的需求,我们还得保证服务器的正常运行。或者说我们需要对服务器的读写速率进行优化,这样我们就不得不运用到这个磁盘阵列(raid )。而所谓的磁盘阵列就是使用…

    Linux干货 2016-08-29
  • Samba & Vsftp

    1、建立samba共享,共享目录为/data,要求:(描述完整的过程)   1)共享名为shared,工作组为magedu;   2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名;   3)添加s…

    Linux干货 2016-12-20
  • 初学Linux

       已经学习了Linux一周了,从原来的设计网页、动画影视制作、3D模型到现在的黑白界面虚拟世界,从原来吃睡由我到现在重回高三生活,说实话,一开始还是不太能适应的,尤其是眼睛,酸胀痛。不过,越努力越幸运,也觉得linux其实很有意思。。以下是我第一篇微博的内容,也是我学习linux一周所总结的知识。 首先,学习一门知识就要先了解他的历史…

    Linux干货 2017-07-15
  • http协议

    ##socket套接字– 套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换。– socketAPI:封装了内核中所提供的socket通信相关的系统调用– socketDomain:根据其所使用的地址– AF_INET:Address Family,Ipv4&#8…

    Linux干货 2017-12-06