目录
1.流程控制语句:case
2.循环语句
(1)for----do-----done
1)取值列表有多种取值方式
2)列表中的复杂值
3)从变量中取值
4)从命令中取值
5)自定义shell分隔符
(2)C语言风格的for
(3)whlie-----do------done
(4)嵌套循环
1)批量添加a.txt文件5个用户
2)打印九九乘法表
3.3个shell脚本实战
实战1
实战2
实战3
1.流程控制语句:case
控制语句:用来实现对程序流程的选择、循环、转向和返回等进行控制。
case是开关语句的一个组成部分;
它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的命令操作
适用于多分支,是一个多选择语句
case 变量或表达式 in
变量或表达式1)
命令序列1
;;
变量或表达式2)
命令序列2
;;
……
*)
默认命令序列
esac
执行流程:
- 首先使用“变量或表达式”的值与值1进行比较,若取值相同则执行值1后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示分支结束;
- 若与值1不相匹配,则继续与值2 进行比较,若取值相同则执行值2 后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示结束分支。
- 依次类推,若找不到任何匹配的值,则执行默认模式“ *) ”后的命令序列,直到遇见esac后结束分支
- 注意事项:
1.“变量或表达式”后面必须为单词in,每一个“变量或表达式”的值必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
2. 匹配中的值可以是多个值,通过“|”来分隔
示例1:
case_1.sh脚本:

运行结果:
示例2:编写一个启动apache服务脚本
case2.sh脚本:
运行结果:
2.循环语句
(1)for----do-----done
语法格式:
for var in list
do
commands
done
或:
for var in list ; do
commands
done
1)取值列表有多种取值方式
可以直接读取in 后面的值,默认以空格做分隔![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
2)列表中的复杂值
可以使用 引号或转义字符”/”来加以约束![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
3)从变量中取值
![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
4)从命令中取值
![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
5)自定义shell分隔符
默认情况下,base shell会以空格、制表符、换行符做为分隔符。通过IFS来自定义为分隔符
指定单个字符做分隔符:
IFS=: #以:冒号做分隔符
可以指定多个
如 IFS='\n':;" #这个赋值会将反斜杠、n、冒号、分号和双引号作为字段分隔符。
注:$'\n'与'\n'时的区别
IFS='\n' #将字符\和字符n作为IFS的换行符。
IFS=$'\n' #真正地使用换行符做为字段分隔符。
![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
(2)C语言风格的for
语法格式:
for ((i=0;i<10;i++))
do
commmands
done
示例1:单个变量。 输出1到10之间的数字
示例2:多个变量。 同时输出1-9的升序和降序
(3)whlie-----do------done
重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令不成立或为假;
语法格式如下:
while 测试命令
do
命令
done
注意:
- 避免陷入死循环 while true
- 自增操作 let var++
- 自减操作 let var--
示例1:降序输出10到1的数字
例2:输出如下图两数相乘的效果
(4)嵌套循环
1)批量添加a.txt文件5个用户
编写脚本的思路![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
- 1 明确脚本的功能
- 2 编写脚本时会使用到那些命令 ? useradd passwd for
- 3 把变化的数据使用变量表示
- 4 选择适合的流程控制 (选择 、 循环 、分支)
![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
2)打印九九乘法表
![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战 ![]()
Shell编程——流程控制case、循环语句1.流程控制语句:case2.循环语句3.3个shell脚本实战
3.3个shell脚本实战
实战1
将/opt目录下所有的日志文件全自动打包
#!/bin/sh
SRC_DIR=/var/log/
DES_DIR=/opt/backup/`date +%Y%m%d`
if
[ ! -d $DES_DIR ] ; then
mkdir -p $DES_DIR
fi
for i in `find $SRC_DIR -name "*.log"`
do
tar czf $i.tgz $i
done
mv /var/log/*.tgz $DES_DIR
ls -lh $DES_DIR
echo "The scripts exec end, Files tar successfully !"
实战2
找出192.168.1.1-10网段中,服务器已经关机的IP地址
#!/bin/bash
i=1
for (( i=1;i<10;i++ ))
do
ping -c 3 192.168.1.$i &> /dev/null
if [ $? -ne 0 ];then
echo 192.168.1.$i is shutdown
fi
done
实战3
批量创建帐号并生成随机密码
#!/bin/bash
for i in boboyu{1..10}
do
useradd $i
pass=`date +%s|md5sum|cut -c 1-8`
sleep 1
echo "$i:$pass" >> /tmp/passwd.log
echo $pass |passwd --stdin $i > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "create user is successfully!"
else
echo "create user is failed!"
fi
done