一、循环控制语句
双层循环和循环语句的使用,while和until的语法使用
1.1、echo 打印
continue:跳出当次,后续的条件成立,继续执行。
break:一旦break,后续的条件不再执行。
exit:满足条件,立刻提出,不论有几层。
-n :表示不换行输出
-e :输出转义字符
\b:相当于退格键(backspace)
\n:换行相当于回车
\f:换行,换行后的新行的开头连着上一行的行尾
\t:相当于tab键 横向制表符
echo -ne
[root@test1 opt]# vim test31.sh
for i in {1..9}
do
for j in {1..9}
do
echo -n $j
done
done
#1
#123456789
#2
#123456789
.....
[root@test1 opt]# sh test31.sh
123456789[root@test1 opt]#
[root@test1 opt]# vim test31.sh
for i in {1..9}
do
for j in {1..9}
do
if [[ $j -le $i ]]
then
echo -n $(($i*$j)) ##漂亮输出echo -ne "$i*$j=$(($i*$j))\t"
fi
done
echo
done
[root@test1 opt]# sh test31.sh
1
24
369
481216
510152025
61218243036
7142128354249
816243240485664
91827364554637281
[root@test1 opt]# vim test32.sh
for ((i=5;i>=1;i--))
do
for ((j=1;j<=i;j++))
do
echo -ne "$i*$j=$(($i*$j))\t"
done
echo
done
[root@test1 opt]# sh test32.sh
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
4*1=4 4*2=8 4*3=12 4*4=16
3*1=3 3*2=6 3*3=9
2*1=2 2*2=4
1*1=1
1.2、break
for i in {1..3}
do
for j in {1..5}
do
if [ $j -eq 3 ]
then
break 2 #跳出2层循环
#循环控制,continue'和break默认值就是1
fi
echo $j
done
#echo $i
done
~
1.3、ontinue
[root@test1 opt]# vim test33.sh
for i in {1..3}
do
for j in {1..5}
do
if [ $j -eq 3 ]
then
continue
#循环控制,continue'和break默认值就是1
fi
echo $j
done
echo $i
done
[root@test1 opt]# sh test33.sh
1
2
4
5
1
1
2
4
5
2
1
2
4
5
3
[root@test1 opt]# vim test33.sh
for i in {1..3}
do
for j in {1..5}
do
if [ $j -eq 3 ]
then
continue 2
#循环控制,continue'和break默认值就是1
fi
echo $j
done
echo $i
done
[root@test1 opt]# sh test33.sh
1
2 #continue 2, 第一层(内层)循环结束,第二层(外层)也结束了,重新开始
1
2
1
2
1.4、exit ##满足条件,立刻退出,退出全部循环体
set -x
sex -x
#关闭调试模式
1.5、while语法:
while满足条件就执行循环,不满足条件才会退出。
死循环,不知道循环多少次,需要主动结束循环或者达到条件才结束循环
while [判断条件]
do
命令序列
done
[root@test1 opt]# vim test34.sh
i=1
sum=0
while [ $i -le 100 ]
do
sum=$(($sum+$i))
let i++
done
echo $sum
[root@test1 opt]# sh test34.sh
5050
[root@test1 opt]# vim test35.sh
i=1
sum=0
while [ $i -lt 101 ]
do
sum=$(($sum+$i))
let i++
done
echo $sum
[root@test1 opt]# sh test35.sh
5050
[root@test1 opt]# vim test35.sh
i=0
sum=0
while [ $i -lt 100 ]
do
sum=$(($sum+$i))
let i++
done
echo $sum
[root@test1 opt]# sh test35.sh
4950
[root@test1 opt]# vim test35.sh
i=0
sum=0
while [ $i -lt 100 ]
do
let i++
sum=$(($sum+$i))
done
echo $sum
~
[root@test1 opt]# sh test35.sh
5050
[root@test1 opt]# vim test35.sh
i=0
sum1=0
sum2=0
while [ $i -lt 100 ]
do
let i++
if [[ $i%2 -eq 0 ]]
then
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
done
echo $sum1
echo $sum2
[root@test1 opt]# sh test35.sh
2550
2500
1.5.1、while 死循环:
while true #永远为真,死循环
while [ 1 -eq 1 ]
while:
1.6、until的语法:
until循环:条件不满足才执行循环,一旦条件成立,循环终止
until [ 条件测试 ]
do
命令序列
done
[root@test1 opt]# vim test36.sh
i=0
until [[ $i -gt 10 ]]
do
let i++
echo $i
done
[root@test1 opt]# sh test36.sh
1
2
3
4
5
6
7
8
9
10
11
#打印出/opt下文件和目录
[root@test1 opt]# vim test36.sh
for i in /opt/*
do
echo $i
done
[root@test1 opt]# sh test36.sh
/opt/!
/opt/11
/opt/123
/opt/123.tar.gz
/opt/1.sh
/opt/222
/opt/2.sh
/opt/333
/opt/3.sh
/opt/456
/opt/4.sh
/opt/7.sh
/opt/hosts.txt
/opt/login.sh
/opt/nginx-1.22.0
/opt/nginx-1.22.0.tar.gz
/opt/passwd.txt
/opt/test11.sh
/opt/test12.sh
/opt/test13.sh
/opt/test14.sh
/opt/test15.sh
/opt/test16.sh
/opt/test17.sh
/opt/test21.sh
/opt/test22.sh
/opt/test23.sh
/opt/test31.sh
/opt/test32.sg
/opt/test32.sh
/opt/test33.sh
/opt/test34.sh
/opt/test35.sh
/opt/test36.sh
/opt/test6.sh
#测试网段,c类私有地址,32位网段,测试可以ping通的保留到/opt/hosts.txt,ping不同,提示不通即可。1-254
[root@test1 opt]# vim test37.sh
for i in {1..254}
do
ping -c 2 192.168.168.$i
if [[ $? -eq 0 ]]
then
echo 192.168.168.$i >> /opt/hosts1.txt
else
echo "ping不通"
fi
done
~
[root@test1 opt]# cat hosts1.txt
2
10
192.168.168.2
192.168.168.10
{
循环体
}&
#把整个循环体的代码看作一个整个内容,相当于并行,&循环成立的内容放入后台执行
done
wait
#计算器,实现整数的+,-,*,/,%
for ((;;))
do
read -p "输入计算数1:" a
read -p "输入计算符:" b
read -p "输入计算数2:" c
sum=$(($a$b$c))
read -p "是否继续" d
if [[ $d == yes ]]
then
echo $sum
else
echo $sum
echo "计算结束"
break
fi
done
[root@test1 opt]# vim test39.sh
#我们定义好了一个密码,脚本判断密码输入是否正确,正确密码是123456,输入>正确,提示输入正确,输入3次密码错误,提示密码已被锁定。
for ((i=1;i<=3;i++))
do
read -p "输入密码" a
if [[ $a == "123456" ]]
then
echo "密码输入正确"
break
elif [[ $i -eq 3 ]]
then
echo "输入3次错误,密码已经被锁定"
else
echo "密码输入错误"
fi
done
[root@test1 opt]# sh test39.sh
输入密码21
密码输入错误
输入密码123
密码输入错误
输入密码123
输入3次错误,密码已经被锁定
密码为空
二、作业
作业1:
#用户名存放在users.txt文件中,每行一个。判断文件里的用户名是否存在
#如果用户用户存在,提示用户已存在
#用户存在,但是没有设置密码,要提示用户设置密码
#用户不存在,创建用户,然后给用户创建密码
for user in $(cat /opt/users.txt)
do
cat /etc/passwd | awk -F: '{print $1}' | grep "$user"
if [[ $? -eq 0 ]]
then
echo "用户存在"
mima=$(cat /etc/shadow | grep "$user" | awk -F: '{print $2}')
if [[ $mima == "!!" || -z "$mima" ]]
then
echo "空密码需要设置密码"
echo 123 | passwd --stdin $user
else
echo "用户有密码"
fi
else
echo "$user用户不存在,需创建"
useradd $user
echo "并创建密码"
echo 123 | passwd --stdin $user
fi
done
[root@test1 opt]# vim users.txt
[root@test1 opt]# useradd xy111
[root@test1 opt]# sh test41.sh
xy108
用户存在
用户有密码
xy110用户不存在,需创建
并创建密码
更改用户 xy110 的密码 。
passwd:所有的身份验证令牌已经成功更新。
xy111
用户存在
空密码需要设置密码
更改用户 xy111 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 opt]# vim test41.sh
[root@test1 opt]# sh test41.sh
xy108
用户存在
用户有密码
xy110
用户存在
用户有密码
xy111
用户存在
用户有密码
作业2:使用循环语句,将一个0-255的十进制转换8位的二进制数;
[root@test1 opt]# vim test42.sh
read -p "输入0-255范围内的数:" a
c=
for ((i=1;i<=8;i++))
do
b=$(($a%2))
c=$b$c
a=$((a/2))
done
echo "$c"
[root@test1 opt]# sh test42.sh
输入0-255范围内的数:67
01000011
[root@test1 opt]# sh test42.sh
输入0-255范围内的数:255
11111111
[root@test1 opt]# sh test42.sh
输入0-255范围内的数:1
00000001
并创建密码
更改用户 xy110 的密码 。
passwd:所有的身份验证令牌已经成功更新。
xy111
用户存在
空密码需要设置密码
更改用户 xy111 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 opt]# vim test41.sh
[root@test1 opt]# sh test41.sh
xy108
用户存在
用户有密码
xy110
用户存在
用户有密码
xy111
用户存在
用户有密码