一、循环中的常见语句
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 waitwait表示等待当前 Shell 中所有在前台或后台运行的子进程(包括通过 & 启动的后台任务)完成后再返回。