深入浅出Linux-Shell编程[四】
4、Shell 分支case语句
case 语句和 if...elif...else 语句一样都是多分支条件语句, 不过和多分支 if 条件语句不同的是, case 语句只能判断 一种条件关系, 而 if 语句可以判断多种条件关系。
1、case 语法格式
| case 变量名 in 值1) 如果变量的值等于值1则执行指令1 ;; 值2) 如果变量的值等于值2则执行指令2 ;; 值3) 如果变量的值等于值3则执行指令3 ;; *) 如果变量的值不等于以上列出的任何值则执行默认指令 esac |
2、case 语句的使用总结
case 语句比较适合变量值较少且为固定的数字或字符串集合情况(非不确定的内容, 例如范围), 如果变量的值 是已知固定的start/stop/restart等元素, 那么采用case语实现就比较适合
case主要是写服务的启动脚本, 一般情况下, 传参不同且具有少量的字符串, 其适用范围窄
if就是取值判断、比较、应用比case更广。几乎所有的case语句都可以用if条件语句实现
case语句就相当于多分支的if/elif/else语句, 但case语句的优势是更规范、易
3、case 语句案例
1、判断输入内容
2、判断输入执行输入指令
二、Shell 编程之循环结构
1、Shell 循环 for 语句
for循环的运作方式, 是讲串行的元素意义取出, 依序放入指定的变量中, 然后重复执行含括的命令区域 (在do和
done 之间) , 直到所有元素取尽为止。
其中, 串行是一些字符串的组合, 彼此用$IFS所定义的分隔符 (如空格符) 隔开, 这些字符串称为字段。
1、for 循环的语法结构
| for 变量 in 值集合 do 执行命令 done |
2、for 语法说明
for 每次从值集合中取一个值赋值给变量
do - done 将赋值后的变量带入执行的命令得到执行结果,
重复以上两个步骤, 直到值集合中的值被一一获取赋值给变量的到所有结果, 循环结束
3、实例
1、用 for 循环创建 demo1-demo10, 然后在 demo1-demo10 创建 test1-test10 的目录
| #!/bin/bash for a in {1..10} do mkdir /datas/demo$a cd /datas/demo$a for b in {1..10} do mkdir test$b done done #!/bin/bash for k in $( seq 1 10 ) # seq a b 用于产生从 a 到 b 之间的所有整数 do mkdir /root/demo${k} cd /root/demo${k} for l in $( seq 1 10 ) do mkdir test${l} cd /root/demo${k} done cd .. done |
| #!/bin/bash DIR="/var" cd $DIR for k in $(ls $DIR) do [ ‐d $k ] && du ‐sh $k done |
# 对/var目录中每一个文件, 进行for循环处理 # 如果/var下的文件是目录, 则使用du ‐sh计算该目录占用磁盘空间的大小 |
2、Shell 循环 while 语句
1、while 循环语法结构
| while 条件测试 do 执行命令 done |
2、while 语法说明
while 首先进行条件测试, 如果传回值为0 (条件测试为真) , 则进入循环, 执行命令区域, 否则不进入循环 满足 while 测试条件, 执行命令区域, 直到 while 的测试条件不满足结束执行while循环 (如果条件一直满足 执行无穷循环) 。
3、实例1while 循环读取文件的内容
| #!/bin/bash while read a 进入循环, 显示读取到的内容 do echo $a done < /datas/6files |
# 使用read有标准输入读取数据, 赋值变量 demo 中, 如果读到的数据非空, 就 |
| #!/bin/bash while read demo do echo ${demo} done < /home/scripts/testfile # 将 /home/scripts/testfile 的内容按行输入给 read 读取 |
|
4、实例2while 条件测试
| #!/bin/bash declare ‐i i=1 declare ‐i sum=0 while ((i<=10)) do let sum+=i let i++ done echo $sum |
# 声明设置 i 和 sum为整数型 # while 条件测试: 只要i值小于或者等于10, 就执行循环 # sum+=i 和 sum=sum+i 是一样的, sum累加上i # let i++, i 的值递增 1, 此行是改变条件测试的命令, 一旦 i 大于10, 可终止循环 # 遇到 done, 回到 while 条件测试 # 直到 while 条件不满足, 显示 sum 的值 |
4、实例3 while 99 乘法表
| #!/bin/bash a=1 =1 while ((a <=9)) do while ((b<=a)) do let "c=a*b" # 声明变量c echo ‐n "$a*$b=$c " # echo 输出显示的格式, ‐n不换行输出 let b++ done let a++ let b=1 # 因为每个乘法表都是1开始乘, 所以b要重置 echo "" # 显示到屏幕换行 done |
3、Shell 循环 until 语句
while循环的条件测试是测真值, until循环则是测假值。
1、 until 循环的语法结构
| until 条件测试 do 执行命令 done |
2、 until 语法说明
until 条件测试结果为假 (传回值不为0) , 就进入循环。
条件测试不满足, 执行命令区域。直到 until 条件满足, 结束执行until 循环 (如果条件一直不满足则执行无穷 循环) 。
3、实例1 until 单层条件测试
| #!/bin/bash declare ‐i i=10 declare ‐i sum=0 until ((i>10)) do let sum+=i let ++i done echo $sum |
# 声明i和sum为整数型 # 条件测试: 只要i值未超过10, 就进入循环 # sum+=i和sum=sum+i是一样的, sum累加上i # i的值递增1, 此行是改变条件测试的命令, 一旦i大于10, 可终止循环 # 遇到done, 回到 until条件测试 # 直到 until 的条件满足显示sum的值 |
4、实例2 until 双层条件测试
4、Shell 循环控制
1、Shell 循环控制说明
break, continue, exit 一般用于循环结构中控制循环的走向。
| 命令 |
说明 |
| break n |
n 表示跳出循环的次数, 如果省略 n 表示跳出整个循环 |
| continue n |
n 表示退到第n层继续循环, 如果省略n表示跳过本次循环进入下一次循环 |
| exit n |
退出当前的shell程序, 并返回 n, n 也可以省略 |
| return |
用于返回一个退出值给调用的函数 |
| shift |
用于将参数列表list左移指定次数, 最左端的那个参数就从列表中删除, 其后边的参数继续进 入循环 |
2、 break 指令
break[N]: 提前结束第N层循环, 最内层为第1层
| while CONDITION1; do CMD1 ... if CONDITION2; then break fi CMDn ... done |
continue: 提前结束本次循环, 提前进入下一轮循环, continue 2 跳出本次内层循环, 进入外层循环
break: 结束本次循环 (整个) , 退出脚本
实例
| [root@qfedu.com ~]#vim test.sh #!/bin/bash for i in {1..10} do [ $i ‐eq 5 ] && break echo i=$i sleep 0.5 done echo test is finished [root@qfedu.com ~]#chmod +x test.sh [root@qfedu.com ~]#./test.sh i=1 i=2 i=3 i=4 test is finished [root@localhost ~]# cat break1.sh #!/bin/bash for((i=0;i<=5;i++)) do if [ $i ‐eq 3 ];then break; fi echo $i done echo "ok" # 运行结果为: [root@localhost ~]# bash break1.sh 0 1 2 ok |
3、continue 指令
continue [N]: 提前结束第N层的本轮循环, 而直接进入下一轮判断; 最内层为第1层
实例
| [root@localhost ~]# cat continue.sh #!/bin/bash for((i=0;i<=5;i++)) do if [ $i ‐eq 3 ];then continue; fi echo $i done echo "ok" #运行结果为: [root@localhost ~]# bash continue.sh 0 1 2 4 5 ok [root@qfedu.com ~]#vim test.sh #!/bin/bash for i in {1..10} do [ $i ‐eq 5 ] && continue echo i=$i sleep 0.5 done echo test is finished [root@qfedu.com ~]#./test.sh i=1 i=2 i=3 i=4 i=6 i=7 i=8 i=9 i=10 test is finished |
4、exit 指令
实例
5、shift 指令
shift 命令用于将参数列表 list 左移指定次数, 最左端的那个参数就从列表中删除, 其后边的参数继续进入循 环。
shift[N]: 用于将参量列表 list 左移指定次数, 缺省为左移一次。
参量列表 list 一旦被移动, 最左端的那个参数就从列表中删 除。while 循环遍历位置参量列表时, 常用到 shift
实例
1、shift 指令实例: 创建指定的多个用户
实例
| #!/bin/bash if [ $# ‐eq 0 ];then echo "请在脚本后输入参数 (例如: $0 arg1) " exit 1 else while [ ‐n "$1" ];do useradd $1 echo 123 |passwd ‐‐stdin $1 shift done fi |
2、运行结果
| [root@qfedu.com ~]# bash test.sh a1 a2 a3 更改用户 a1 的密码 。 passwd: 所有的身份验证令牌已经成功更新。 更改用户 a2 的密码 。 passwd: 所有的身份验证令牌已经成功更新。 更改用户 a3 的密码 。 passwd: 所有的身份验证令牌已经成功更新。 |
分析: 如果没有输入参数 (参数的总数为0) , 提示错误并退出; 反之, 进入循环; 若第一个参数不为空字符, 则 创建以第一个参数为名的用户, 并移除第一个参数, 将紧跟的参数左移作为第一个参数, 直到没有第一个参数, 退 出。
3、打印直角三角形的字符
实例
| #!/bin/bash while (($# > 0));do echo "$*" shift done |
| [root@qfedu.com ~]# bash test1.sh 1 2 3 4 5 6 7 1 2 3 4 5 6 7 2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7 6 7 7 |
- 点赞
- 收藏
- 关注作者
评论(0)