结构化命令case和for、while循环

 

一、  流程控制语句:case

 
控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制。case是开关语句的一个组成部分;
它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的命令操作
 
适用于多分支,是一个多选择语句
case     变量值     in
             模式1)
                     命令序列1
                   命令序列2
                     ;;
             模式2)
                     命令序列2
                     ;;
                     ……
                     *)
                     默认命令序列
esac
 
case “找对象的条件” in
        有钱)
                
                ;;
        家里有房|还是两套)
                
                ;;
        *)
                算了
esac
 
执行流程:
首先使用“变量值”与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示分支结束;若与模式1不相匹配,则继续与模式2 进行比较,若取值相同则执行模式2 后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示结束分支,……依次类推,若找不到任何匹配的值,则执行默认模式“ *) ”后的命令序列,直到遇见esac后结束分支
 
注意事项:
取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
匹配中的值可以是多个值,通过“|”来分隔
取值将检测匹配每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令
它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break
 
 
范例1:用户输入0-9任意一个数字,通过case来判断用户输入的是哪一个数字?
[root@xuegod1603 days3]# cat case-1.sh
#!/bin/bash
read -p "Type a num ==> " NUM
case $NUM in
        1)
                echo "Input a num is 1 "
                ;;
        2)
                echo "Input a num is 2 "
                ;;
        [3-8])
                echo "Input a num is $NUM"
                ;;
        9|0)
                echo "Input a num is $NUM"
                ;;
        *)
                echo "Please input [0-9]"
esac
 
[root@xuegod1603 days3]# sh case-1.sh
Type a num ==> 2
Input a num is 2
[root@xuegod1603 days3]# sh case-1.sh
Type a num ==> 6
Input a num is 6
[root@xuegod1603 days3]# sh case-1.sh
Type a num ==> 0
Input a num is 0
[root@xuegod1603 days3]# sh case-1.sh
Type a num ==> aaa
Please input [0-9]
我们也可以用If语句来实现
[root@xuegod1603 days3]# cat if-1.sh
#!/bin/bash
read -p "Please input a num " NUM
if [ $NUM -eq 1 ];then
        echo "THE NUM IS $NUM"
elif [ $NUM -eq 2 ];then
        echo "THE NUM IS $NUM"
elif [ $NUM -ge 3 -a $NUM -le 8 ];then
        echo "THE NUM IS $NUM"
elif [ $NUM -eq 0 -o $NUM -eq 9 ];then
        echo "THE NUM IS $NUM"
else
        echo "INPUT A NUM [0-9]"
fi
[root@xuegod1603 days3]# sh if-1.sh
Please input a num 3
THE NUM IS 3
[root@xuegod1603 days3]# sh if-1.sh
Please input a num 0
THE NUM IS 0
[root@xuegod1603 days3]# sh if-1.sh
Please input a num 6
THE NUM IS 6
[root@xuegod1603 days3]# sh if-1.sh
Please input a num fwer
if-1.sh: line 3: [: fwer: integer expression expected
if-1.sh: line 5: [: fwer: integer expression expected
if-1.sh: line 7: [: fwer: integer expression expected
if-1.sh: line 9: [: fwer: integer expression expected
INPUT A NUM [0-9]
[root@xuegod1603 days3]# sh if-1.sh
Please input a num 56
INPUT A NUM [0-9]
 
范例2:启动HTTPD服务
[root@xuegod1603 days3]# cat case-http.sh
#!/bin/bash
case $1 in
        start)
                systemctl $1 httpd
                ps -ef|grep -v grep |grep httpd &> /dev/null
                if [ $? -eq 0 ];then
                        echo "HTTPD is start...."
                fi
                ;;
        stop)
                systemctl $1 httpd
                echo "httpd stop...."
                ;;
        status)
                systemctl $1 httpd
                ;;
        restart)
                systemctl $1 httpd
                ;;
        *)
                echo "USAGE:`basename $0` start|stop|status|restart"
esac
 
 
扩展:shell中色彩的处理
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e(可以用来识别我们的转义字符)
格式:
        echo -e \033[背景颜色;文字颜色xxxx\033[0m
        echo -e \e[背景颜色;文字颜色xxxx\e[0m
例子:
 
其中42的位置代表底色,34的位置代表的是字的颜色,0m是清除所有格式
注:
1、字背景颜色和文字颜色之间是英文的分号";"
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
4、echo显示带颜色,需要使用参数-e
下面是文字颜色:
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
下面是背景颜色:
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
控制选项:
\033[0m 关闭所有属性
\033[1m 设置高亮度,加粗
\033[5m 闪烁
 
范例3:判断不同的物品用不同的颜色来表示
[root@xuegod1603 days3]# cat case-3.sh
#!/bin/bash
#cat <<eof
#===============
# 1. book
# 2. pear
# 3. cat
# =============
#eof
echo '
==============
        1.book
        2.pear
        3.cat
=============
'
read -p "Please a num : " NUM
case “$NUM” in
        1|book)
                echo -e "\e[1;31mbook\e[0m"
                ;;
        2|pear)
                echo -e "\e[1;32mpear\e[0m"
                ;;
        3)
                echo -e "\e[1;33mcat\e[0m"
                ;;
        *)
                echo "Pleas is a num"
esac
 
 

二、循环语句

1、for-do-done
语法格式:
for 变量名 in 变量取值列表
do
  commands if
done
======================
for var in list;do
  commands
done
 
取值列表有多种取值方式,比如
(1)可以直接读取IN后面的值,默认以空格做分隔
[root@xuegod1603 days3]#
[root@xuegod1603 days3]# cat for-1.sh
#!/bin/bash
for var in a b c
do
        echo the text is $var
done
 
[root@xuegod1603 days3]# sh for-1.sh
the text is a
the text is b
the text is c
 
(2)列表中的复杂值,注意双引号和转义字符的使用
[root@xuegod1603 days3]# cat for-2.sh
#!/bin/bash
for i in a b "xue god" c "d e"
do
        echo the text is $i
done
[root@xuegod1603 days3]# sh for-2.sh
the text is a
the text is b
the text is xue god
the text is c
the text is d e
 
[root@xuegod1603 days3]# cat for-3.sh
#!/bin/bash
for i in a b "xue god" c "It's man"
do
        echo the test is $i
done
[root@xuegod1603 days3]# sh for-3.sh
the test is a
the test is b
the test is xue god
the test is c
the test is It's man
[root@xuegod1603 days3]# vim for-3.sh
[root@xuegod1603 days3]# cat for-3.sh
#!/bin/bash
for i in a b "xue god" c It\'s man
do
        echo the test is $i
done
[root@xuegod1603 days3]# sh for-3.sh
the test is a
the test is b
the test is xue god
the test is c
the test is It's
the test is man
 
(3)从变量中取值
[root@xuegod1603 days3]# cat for-4.sh
#!/bin/bash
list="a1 b1 c1 d1"
for i in $list
do
        echo $i
done
[root@xuegod1603 days3]# sh for-4.sh
a1
b1
c1
d1
 
(4)从命令中取值
[root@xuegod1603 days3]# cat for-5.sh
#!/bin/bash
for i in `cat /etc/hosts`
do
        echo $i
done
 
for i in $(ls /mnt)
do
        echo  $i
done
[root@xuegod1603 days3]# sh for-5.sh
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6
CentOS_BuildTag
EFI
EULA
GPL
images
isolinux
LiveOS
Packages
repodata
RPM-GPG-KEY-CentOS-7
RPM-GPG-KEY-CentOS-Testing-7
TRANS.TBL
 
(5)字段分隔符
        默认情况下,base shell会把空格,制表符,换行符,我们也可以通过IFS来指定其中的一种做为分隔符
[root@xuegod1603 days3]# cat for-6.sh
#!/bin/bash
IFS=$\n
IFS='     #IFS=里面直接回车
'
for i in `cat /etc/hosts`
do
        echo $i
done
[root@xuegod1603 days3]# sh for-6.sh
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
 
[root@xuegod1603 days3]# cat for-7.sh
#!/bin/bash
IFS=:
list=$(head -1 /etc/passwd)
for i in $list
do
        echo $i
done
[root@xuegod1603 days3]# sh for-7.sh
root
x
0
0
root
/root
/bin/bash
[root@xuegod1603 days3]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
 
注意:IFS的使用
可以单独指定
        IFS=:
        IFS=$\n
可以指定多个
        IFS=$\n:;
 
(6)C语言风格的for
例1:单个变量
[root@xuegod1603 days3]# cat for-8.sh
#!/bin/bash
#for-c
for ((i=0;i<10;i++))
do
        echo Num is $i
done
[root@xuegod1603 days3]# sh for-8.sh
Num is 0
Num is 1
Num is 2
Num is 3
Num is 4
Num is 5
Num is 6
Num is 7
Num is 8
Num is 9
 
例2:多个变量
[root@xuegod1603 days3]# cat for-9.sh
#!/bin/bash
for ((a=2,b=4;a<8;a++,b--))
do
        echo num is "$a - $b"
done
[root@xuegod1603 days3]# sh for-9.sh
num is 2 - 4
num is 3 - 3
num is 4 - 2
num is 5 - 1
num is 6 - 0
num is 7 - -1
 
扩展:数字列表的获取方式
[root@xuegod1603 days3]# cat for-10.sh
#!/bin/bash
for i in {5..10}
do
        echo $i
done
 
echo =============
 
for i in `seq 2 8`
do
        echo $i
done
 
命令:seq
-w  补全
[root@xuegod1603 days3]# seq -w 6 10   意思是如果最大数是两位,不足两位的用0补起
06
07
08
09
10
步长,跨度
[root@xuegod1603 days3]# seq 2 2 7  从2开始计算,每次加2,最大到7
2
4
6
 

2、while-do-done

重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令不成立或为假;
语法格式如下:
while 测试命令
do
命令
done
 

 

注意:避免陷入死循环  while true     while false ,循环退出根据测试条件的退出码来定
 
范例1:
[root@xuegod1603 days3]# cat while-1.sh
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
        echo $var
        var=$[$var-1]
done
[root@xuegod1603 days3]# sh while-1.sh
10
9
8
7
6
5
4
3
2
1
 
范例2:
自增操作:let var++
自减操作:let var--
[root@xuegod1603 days3]# cat while-2.sh
#!/bin/bash
num=1
while [ $num -lt 10 ]
do
        sum=$(expr $num \* $num)
        echo "$num * $num = $sum"
        let num++
done
[root@xuegod1603 days3]# sh while-2.sh
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
6 * 6 = 36
7 * 7 = 49
8 * 8 = 64
9 * 9 = 81
 
[root@xuegod1603 days3]# cat while-3.sh
#!/bin/bash
num=1
while [ $num -lt 5 ]
do
        sum=$(expr $num \* $num)
        echo "$num * $num = $sum"
#        let num++
        ((num++))
done
[root@xuegod1603 days3]# sh while-2.sh
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
 
 
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值