for循环(2)

发布于:2024-06-19 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、循环中的常见语句

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};do
 for ((j=1;j<=i;j++));do
  echo -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);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


​ 验证:

[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 ]];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次即可。

    验证:

    [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;do
     cat $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/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 中所有在前台或后台运行的子进程(包括通过 & 启动的后台任务)完成后再返回。