您的位置:首页 > 游戏 > 游戏 > for循环(2)

for循环(2)

2024/10/6 18:26:27 来源:https://blog.csdn.net/weixin_44265455/article/details/139778339  浏览:    关键词:for循环(2)

一、循环中的常见语句

1.1 echo 打印

  • -n :表示不换行输出
  • -e :输出转义字符
    • \b :相当于退格键(backspace)
    • \n :换行,相当于回车
    • \f :换行,换行后的新行的开头连着上一行的行尾
    • \t :插入一个tab键,横向制表符,相当于一个大空格键

1.2 循环控制语句

break :跳出当前循环并终止

continue:跳出当前循环,如果条件仍满足,继续执行循环

exit:满足条件,立即退出脚本

对于多层循环,在内层循环使用breakcontinue只是跳出当前层的循环,如果想要跳出多层循环,可以在breakcontinue后加上跳出的层数,比如要跳出双循环可用break 2continue 2

1.3 whileuntil 的用法

while满足条件就执行循环,不满足条件才会退出。

while适用场景:死循环,不知道循环多少次,需要主动结束循环或者达到条件才结束循环。

while [判断条件]
do命令
done

死循环:三种格式

  • while true #永远为真,即死循环
  • while [ 1 -eq 1 ] #相当于true,[ ]里是一个永远为真的条件
  • while :

until循环:条件不满足才执行循环,一旦条件成立,循环终止。即执行命令直到满足until的条件才终止。

until [条件测试]
do命令序列
done

二、双循环

例:利用双循环实现99乘法表:

vim test1.sh
for i in {1..9};dofor ((j=1;j<=i;j++));doecho -ne "$i*$j=$(($i*$j))\t"done
echo
done
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	

三、练习

  1. 用户名存放在users.txt文件中,每行一个。判断文件里的用户名是否存在。
    如果用户存在,提示用户已存在
    如果用户存在,但是没有设置密码,要提示用户设置密码
    用户不存在,创建用户,然后给用户创建密码
vim p4.sh
for user in $(cat /opt/user.txt);docat /etc/passwd | awk -F: '{print $1}' | grep "$user" &> /dev/nullif [ $? == 0 ];thenmm=$(cat /etc/shadow | grep "$user" | awk -F: '{print $2}')if [ $mm == !! ] || [ -z $mm ];thenecho "${user}账户已存在,未设置密码,请及时设置!"elseecho "${user}账户已存在,密码已设置!"fielseuseradd $userread -p "为用户${user}创建密码:" pwecho $pw | passwd --stdin $userecho "用户${user}创建成功,密码已设置。"fi
done

​ 验证:

[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账户已存在,未设置密码,请及时设置!
  1. 使用循环语句,将一个范围0-255的十进制数转换成8位的二进制数,不足8位的要补0

    read -p "请输入一个0-255之间的整数:" num
    if [ $num -eq $num ] && [[ $num -ge 0 && $num -le 255 ]];thenfor ((i=0;i<8;i++));dob=$(($num%2))$bnum=$(($num/2))done
    elseecho "输入错误!"exit
    fi
    echo $b

    解释:思路为通过除2取余数的方法计算十进制转二进制数。

    变量b初始为空,在循环体中将每一次变量num除2的余数拼接到一起,再把除2得到的商再赋给变量num,除满8次即可。

    验证:

    [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
    
  2. 利用for循环,将/opt目录下,所有以.txt结尾的文件合并成一个文件,合并到ykw.txt

    for file in /opt/*.txt;docat $file >> /opt/practice3/ykw.txt
    done
    
  3. #测试一个网段,C类私有地址,32位的网段,测试可以ping通的地址,保留到/opt/hosts.txt;如果不通,提示不通即可。

    read -p "请输入检测的网段,如(20.0.0.):" ip
    for ((i=1;i<255;i++));do
    {ping -c 2  $ip$i &> /dev/nullif [ $? -eq 0 ];thenecho "$ip$i is online"echo "$ip$i" >> /opt/hosts.txtelseecho "$ip$i is offline"fi
    }&
    #{ }把整个循环体的代码看做一个整体,相当于并行,
    #&符号表示把循环成立的内容放到后台执行
    done
    wait
    

    wait表示等待当前 Shell 中所有在前台或后台运行的子进程(包括通过 & 启动的后台任务)完成后再返回。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com