Shell编程之循环语句
文章目录
- 引言
- 1.echo命令参数
- 2.for循环语句
- 2.1 for语句的结构
- 2.2 for语句的执行流程
- 2.3 for语句应用示例
- 3. while循环语句
- 3.1 while 语句的结构
- 3.2 while 语句的执行流程
- 3.3 while语句应用示例
引言
在实际工作中,经常会遇到某项目需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,命令都是相同的。当面对各种列表重复执行任务时,使用简单的if语句很难满足要求,并且顺序编写全部代码更是显得异常繁琐,这时候就可以使用for循环语句,可以很好的解决这样的问题。
1.echo命令参数
echo [参数] [字符串]
2.for循环语句
2.1 for语句的结构
-
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。
-
for 循环语句的语法结构如下
for 变量名 in 取值列表
do
命令序列
done
- 上述语句结构中,操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do 和done之间的命令序列称为“循环体”,其中的执行语句需要引用变量以完成相应的任务。
2.2 for语句的执行流程
-
首先将列表中的第1个取值赋给变量,并执行 do···done循环体中的命令序列
-
然后将列表中的第2个取值赋给变量,并执行循环体中的命令序列……
-
以此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
2.3 for语句应用示例
- 根据姓名列表批量添加用户,操作如下
[root@clr /opt/mywork]# cat user.txt
gaozhenyang
ergouzi
wolong
fengchu
[root@clr /opt/mywork]# cat add.sh
#!/bin/bash
ud=$(cat /opt/mywork/user.txt)
for uname in $ud
do
useradd $uname
echo "123456" |passwd --stdin $uname &>/dev/null
echo "$uname用户创建成功"
done
[root@clr /opt/mywork]# bash add.sh
gaozhenyang用户创建成功
ergouzi用户创建成功
wolong用户创建成功
fengchu用户创建成功
[root@clr /opt/mywork]# tail -5 /etc/passwd
cd:x:1016:1016::/home/cd:/bin/bash
gaozhenyang:x:1017:1017::/home/gaozhenyang:/bin/bash
ergouzi:x:1018:1018::/home/ergouzi:/bin/bash
wolong:x:1019:1019::/home/wolong:/bin/bash
fengchu:x:1020:1020::/home/fengchu:/bin/bash
- 根据 IP 地址列表检查主机状态
[root@clr /opt/mywork]# cat ipadd
192.168.80.1
192.168.80.2
192.168.80.3
192.168.80.20
[root@clr /opt/mywork]# cat ip.sh
#!/bin/bash
host=$(cat /opt/mywork/ipadd)
for IP in $host
do
ping -c 3 -i 0.2 -W 3 $IP &>/dev/null #-c是发送ping包的数量为3
if [ $? -eq 0 ] #-i是收发信息的间隔时间为0.2s
then #-W是超时时间为3s
echo "HOST $IP is up"
else
echo "HOST $IP is down"
fi
done
[root@clr /opt/mywork]# bash ip.sh
HOST 192.168.80.1 is up
HOST 192.168.80.2 is up
HOST 192.168.80.3 is down
HOST 192.168.80.20 is up
- 密码输入正确和错误提示
[root@clr /opt/mywork]# cat mima.sh
#!/bin/bash
init=123456
for i in {1..3}
do
read -p "请输入用户密码:" passwd
if [ $passwd == $init ]
then
echo "密码正确"
exit
fi
done
echo "密码错误"
[root@clr /opt/mywork]# bash mima.sh
请输入用户密码:456123
请输入用户密码:4561596
请输入用户密码:469893
密码错误 #密码输入错误三次直接退出交互界面
[root@clr /opt/mywork]# bash mima.sh
请输入用户密码:66451
请输入用户密码:123456
密码正确 #密码输入成功提示密码输入正确
3. while循环语句
for循环语句非常适合于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用while语句。
3.1 while 语句的结构
使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。但是在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。
循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while循环语句的语法结构如下所示:
while 条件测试操作
do
命令序列
done
3.2 while 语句的执行流程
首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do···done 循环体中的命令序列
返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体
再次返回到 while 后,判断条件测试结果…如此循环
直到 while 后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环
3.3 while语句应用示例
- 批量添加规律编号的用户
[root@clr /opt/mywork]# cat useradd.sh
#!/bin/bash
add="clr"
i=1
while [ $i -le 10 ]
do
useradd ${add}$i
echo "123456"|passwd --stdin ${clr}$i &>/dev/null
let i++
done
[root@clr /opt/mywork]# bash useradd.sh
[root@clr /opt/mywork]# grep "clr" /etc/passwd | tail -10
clr1:x:1031:1031::/home/clr1:/bin/bash
clr2:x:1032:1032::/home/clr2:/bin/bash
clr3:x:1033:1033::/home/clr3:/bin/bash
clr4:x:1034:1034::/home/clr4:/bin/bash
clr5:x:1035:1035::/home/clr5:/bin/bash
clr6:x:1036:1036::/home/clr6:/bin/bash
clr7:x:1037:1037::/home/clr7:/bin/bash
clr8:x:1038:1038::/home/clr8:/bin/bash
clr9:x:1039:1039::/home/clr9:/bin/bash
clr10:x:1040:1040::/home/clr10:/bin/bash
上述脚本代码中,使用变量 i 来控制用户名称的编号,初始赋值为1,并且当取值大于10时终止循环。在循环中,通过语句 “let i++”(等同于i=‘expr $i+1’)来使变量i的值增加1,因此当执行第一次循环后i的值将变成2,执行第2次循环后i的值将变成3…以此类推。
- 猜数字大小
[root@clr /opt/mywork]# cat cai.sh
#!/bin/bash
NUM=8
while true
do
read -p "请输入数字:" sz
if [ $sz -eq $NUM ];then
echo "你猜对了!"
break
elif [ $sz -gt $NUM ];then
echo "你猜大了"
elif [ $sz -lt $NUM ];then
echo "你猜小了"
fi
done
[root@clr /opt/mywork]# bash cai.sh
请输入数字:4
你猜小了
请输入数字:6
你猜小了
请输入数字:7
你猜小了
请输入数字:8
你猜对了!
[root@clr /opt/mywork]# bash cai.sh
请输入数字:20
你猜大了
请输入数字:45
你猜大了
请输入数字:12
你猜大了
请输入数字:9
你猜大了
请输入数字:8
你猜对了!