一、循环中的常见语句
1.1 echo
打印
-n
:表示不换行输出-e
:输出转义字符\b
:相当于退格键(backspace)\n
:换行,相当于回车\f
:换行,换行后的新行的开头连着上一行的行尾\t
:插入一个tab
键,横向制表符,相当于一个大空格键
1.2 循环控制语句
break
:跳出当前循环并终止
continue
:跳出当前循环,如果条件仍满足,继续执行循环
exit
:满足条件,立即退出脚本
对于多层循环,在内层循环使用break
、continue
只是跳出当前层的循环,如果想要跳出多层循环,可以在break
、continue
后加上跳出的层数,比如要跳出双循环可用break 2
,continue 2
。
1.3 while
和 until
的用法
while
满足条件就执行循环,不满足条件才会退出。
while
适用场景:死循环,不知道循环多少次,需要主动结束循环或者达到条件才结束循环。
bash
while [判断条件]
do
命令
done
死循环:三种格式
while true
#永远为真,即死循环while [ 1 -eq 1 ]
#相当于true,[ ]
里是一个永远为真的条件while :
until
循环:条件不满足才执行循环,一旦条件成立,循环终止。即执行命令直到满足until
的条件才终止。
until [条件测试]
do
命令序列
done
二、双循环
例:利用双循环实现99乘法表:
bash
vim test1.sh
for i in {1..9};do
for ((j=1;j<=i;j++));do
echo -ne "$i*$j=$(($i*$j))\t"
done
echo
done
bash
sh test1.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
三、练习
- 用户名存放在users.txt文件中,每行一个。判断文件里的用户名是否存在。
如果用户存在,提示用户已存在
如果用户存在,但是没有设置密码,要提示用户设置密码
用户不存在,创建用户,然后给用户创建密码
bash
vim p4.sh
for user in $(cat /opt/user.txt);do
cat /etc/passwd | awk -F: '{print $1}' | grep "$user" &> /dev/null
if [ $? == 0 ];then
mm=$(cat /etc/shadow | grep "$user" | awk -F: '{print $2}')
if [ $mm == !! ] || [ -z $mm ];then
echo "${user}账户已存在,未设置密码,请及时设置!"
else
echo "${user}账户已存在,密码已设置!"
fi
else
useradd $user
read -p "为用户${user}创建密码:" pw
echo $pw | passwd --stdin $user
echo "用户${user}创建成功,密码已设置。"
fi
done
验证:
bash
[root@test1 practice3]# cat /opt/user.txt
test1
root
dn
class1
nginx
[root@test1 practice3]# sh p4.sh
test1账户已存在,密码已设置!
root账户已存在,密码已设置!
为用户dn创建密码:123
Changing password for user dn.
passwd: all authentication tokens updated successfully.
用户dn创建成功,密码已设置。
为用户class1创建密码:123
Changing password for user class1.
passwd: all authentication tokens updated successfully.
用户class1创建成功,密码已设置。
nginx账户已存在,未设置密码,请及时设置!
-
使用循环语句,将一个范围0-255的十进制数转换成8位的二进制数,不足8位的要补
0
。bashread -p "请输入一个0-255之间的整数:" num if [ $num -eq $num ] && [[ $num -ge 0 && $num -le 255 ]];then for ((i=0;i<8;i++));do b=$(($num%2))$b num=$(($num/2)) done else echo "输入错误!" exit fi echo $b
解释:思路为通过除2取余数的方法计算十进制转二进制数。
变量
b
初始为空,在循环体中将每一次变量num
除2的余数拼接到一起,再把除2得到的商再赋给变量num
,除满8次即可。验证:
bash[root@test1 practice3]# sh p5.sh 请输入一个0-255之间的整数:8 00001000 [root@test1 practice3]# sh p5.sh 请输入一个0-255之间的整数:192 11000000 [root@test1 practice3]# sh p5.sh 请输入一个0-255之间的整数:224 11100000 [root@test1 practice3]# sh p5.sh 请输入一个0-255之间的整数:255 11111111
-
利用for循环,将/opt目录下,所有以.txt结尾的文件合并成一个文件,合并到ykw.txt
bashfor file in /opt/*.txt;do cat $file >> /opt/practice3/ykw.txt done
-
#测试一个网段,C类私有地址,32位的网段,测试可以ping通的地址,保留到/opt/hosts.txt;如果不通,提示不通即可。
bashread -p "请输入检测的网段,如(20.0.0.):" ip for ((i=1;i<255;i++));do { ping -c 2 $ip$i &> /dev/null if [ $? -eq 0 ];then echo "$ip$i is online" echo "$ip$i" >> /opt/hosts.txt else echo "$ip$i is offline" fi }& #{ }把整个循环体的代码看做一个整体,相当于并行, #&符号表示把循环成立的内容放到后台执行 done wait
wait表示等待当前 Shell 中所有在前台或后台运行的子进程(包括通过 & 启动的后台任务)完成后再返回。