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

相关推荐

  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-29
  • 第三周(3):课堂练习与作业

    课堂练习: 1、找出ifconfig命令结果中本机的所有IPv4地址 [root@centos6 ~]# ifconfig | tr -cs '[0-9].' '\n'|sort -ut. -k3n 127.0.0.1 10.1.…

    Linux干货 2016-08-08
  • 马哥教育网络班20期第3周课程练习

    答: 1、 [root@totooco ~]# who | cut -c1-9 | sort -u 2、 [totooco@totooco ~]$ who | cut -c1-9 | head -1 3、 [root@totooco ~]# cat /etc/passwd | cut -d: -f7 | grep -v /sbin/nologin | sor…

    Linux干货 2016-06-23
  • 第一周作业-03

    ifconfig命令:查看及临时修改网卡配置信息    查看的用法:ifconfig [-v] [-a] [-s] [INTERFACE]        OPTIONS            -v:详细显示接口报错信息   &nb…

    Linux干货 2016-09-19
  • 计算机的组成及其功能

    <p> Debian     基于Debian二次开发的:Ubuntu RedHat 不同的发行版都是基于linux内核进行二次开发而来。 查看内核版本命令: uname -r [root@localhost ~]# uname -r 3.10.0-327.18.2.el7.x86<em>64 查看发行版本命令: …

    Linux干货 2016-06-23
  • diy自己的linux

    准备一台liunx的机器,我用的是liunx虚拟机 单独加载一块硬盘,我加载了一块20G的硬盘,然后用fdisk /dev/sdb进行分区,sdb1用来作为将来系统的/boot分区,所有100M就可以了,sdb2用来作为将来系统的/分区,我给了10G。然后将两个分区格式化为ext4系统。 mkdir /mnt/boot mkdir /mnt/sdc2 mou…

    Linux干货 2016-09-14