1.什么是while
while在shell中也是负责循环的语句,和for一样
2.while循环和for循环怎么选?
因为功能一样,很多人在学习和工作中的脚本遇到循环到底该使用for还是while呢?
如果不知道,就会出现遇到循环就只用for,一遇到循环就用while的情况。到底选for还是while好:
1.知道循环次数的用for,比如循环20次
2.如果不知道要循环多少次的,那就用while,比如猜数字游戏,每个人猜对的次数是未知的
3.while循环基础语法
#当条件测试成立(条件测试为真),执行循环
while 条件测试
do
循环体
done
#示例:
[root@manage while]# cat while-0.sh
#!/bin/bash
while true
do
echo "123"
done
#输出123,一直输出
1.比较for循环和while循环区别
#用for循环和while循环从1-10
[root@manage while]# cat while-01.sh
#!/bin/bash
#for i in {1..10}
#do
#echo $i
#done
i=1
while [ $i -le 10 ]
do
echo $i
let i++
done
#用while循环,从1-9 ,从9-1
[root@manage while]# cat while-02.sh
#!/bin/bash
#用for循环实现
for_numb(){
a=1
b=9
for i in {1..9}
do
echo $a + $b = $[ $a + $b ]
let a++
let b--
done
}
#用while循环实现
a=1
b=9
while [ $a -le 9 ]
do
echo $a + $b = $[ $a + $b ]
let a++
let b--
done
[root@manage while]# sh while-02.sh
1 + 9 = 10
2 + 8 = 10
3 + 7 = 10
4 + 6 = 10
5 + 5 = 10
6 + 4 = 10
7 + 3 = 10
8 + 2 = 10
9 + 1 = 10
#实现乘法
[root@manage while]# cat while-02.sh
#!/bin/bash
a=9
while [ $a -ge 1 ]
do
echo "$a * $a = $[ $a * $a ]"
let a--
done
[root@manage while]# sh while-02.sh
9 * 9 = 81
8 * 8 = 64
7 * 7 = 49
6 * 6 = 36
5 * 5 = 25
4 * 4 = 16
3 * 3 = 9
2 * 2 = 4
1 * 1 = 1
2.循环嵌套整数比对,判断用户输入的数值是否大于0,如果大于0,则三秒输出一次大于
[root@manage while]# cat while-03.sh
#!/bin/bash
read -p "请输入数字:" num
while [ $num -gt 0 ]
do
echo "大于0"
sleep 3
done
[root@manage while]# sh while-03.sh
请输入数字:1
大于0
大于0
大于0
3.判断/tmp/1.txt文件是否存在,如果存在退出,如果不存在则3s输出一次 not found
[root@manage while]# cat while-04.sh
#!/bin/bash
#第一种写法
first(){
if [ -f /tmp/1.txt ];then
exit
else
while true
do
echo "/tmp/1.txt not found"
sleep 3
if [ -f /tmp/1.txt ];then
exit
fi
done
fi
}
#第二种写法
while [ ! -f /tmp/1.txt ]
do
echo "/tmp/1.txt not found"
sleep 3
done
4.判断用户输入的用户名,如果不是root,则让用户一直输入
[root@manage while]# cat while-05.sh
#!/bin/bash
read -p "请输入用户名:" User
while [ $User != "root" ]
do
read -p "请输入用户名:" User
done
[root@manage while]# sh while-05.sh
请输入用户名:etret
请输入用户名:root
#带正则匹配的,观摩一下就行
[root@manage while]# cat while-06.sh
#!/bin/bash
read -p "请输入用户名:" User
#记得正则匹配都需要双括号[[]],.代表一个字符,^r...$:只能输入r开头,且是4个字符
while [[ ! $User =~ ^r...$ ]]
do
read -p "请输入用户名:" User
done
[root@manage while]# sh while-06.sh
请输入用户名:tttt
请输入用户名:tttt
请输入用户名:r
5.while读取文件
[root@manage while]# cat while-07.sh
#!/bin/bash
#while读入文件,默认按行读入,for默认按空格读入文件,用IFS调整默认分隔符
while read file
do
echo $file
sleep 3
done</etc/passwd
[root@manage while]# sh while-07.sh
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
# exit
# break
# continue
在我们使用循环语句进行循环的过程中,有时候需要在未达到循环结束条件时强制跳出循环,就需要用到:exit、break、continue
1.exit退出整个程序,当脚本碰到exit时,直接退出,剩余不管有多少代码都不执行
[root@manage while]# cat while-08.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
exit
echo "456"
done
echo "结束"
[root@manage while]# sh while-08.sh
123
2.break跳出本次循环,执行循环之后的代码
[root@manage while]# cat while-08.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
break
echo "456"
done
echo "结束"
[root@manage while]# sh while-08.sh
123
结束
3.continue忽略本次循环剩余的所有代码,直接进行下一次循环,直到循环结束,然后继续循环之后的代码
[root@manage while]# cat while-08.sh
#!/bin/bash
for i in {1..3}
do
echo "123"
continue
echo "456"
done
echo "结束"
[root@manage while]# sh while-08.sh
123
123
123
结束
需求1:循环嵌套continue,打印1-9当数值为5则跳过本次循环,继续下一次循环,请人别用for和while实现
#for循环实现
[root@manage while]# cat while-09.sh
#!/bin/bash
for i in {0..8}
do
let i++
if [ $i -eq 5 ];then
continue
fi
echo $i
done
#while循环实现
[root@manage while]# cat while-09.sh
#!/bin/bash
i=0
while [ $i -le 8 ]
do
let i++
if [ $i -eq 5 ];then
continue
fi
echo $i
done
[root@manage while]# sh while-09.sh
1
2
3
4
6
7
8
9
需求2:循环嵌套break,打印1-9当数值为5则停止,请分别使用for和while实现
#用for循环实现
[root@manage while]# cat while-10.sh
#!/bin/bash
for i in {0..8}
do
let i++
if [ $i -eq 5 ];then
break
fi
echo $i
done
#用while循环实现
[root@manage while]# cat while-10.sh
#!/bin/bash
i=0
while [ $i -le 8 ]
do
let i++
if [ $i -eq 5 ];then
break
fi
echo $i
done
[root@manage while]# sh while-10.sh
1
2
3
4
需求3:使用while读入文件的方式创建用户
[root@manage while]# cat while-11.sh
#!/bin/bash
while read line
do
id $line &>/dev/null
if [ $? -eq 0 ];then
echo $line用户已存在
continue
else
useradd $line
echo "$line用户已创建"
fi
done < user.txt
[root@manage while]# cat user.txt
qqq
ttt
ddd
需求4:使用while读入文件方式,批量创建用户以及密码:文件格式:username:password
[root@manage while]# cat user.txt
qqq:111
ttt:111
ddd:111
[root@manage while]# cat while-12.sh
#!/bin/bash
while read line
do
User=$(echo $line | awk -F ":" '{print $1}')
Pw=$(echo $line | awk -F ":" '{print $2}')
echo $User
echo $Pw
id $User &>/dev/null
if [ $? -eq 0 ];then
continue
else
useradd $User
echo "$Pw" | passwd --stdin $User &>/dev/null
fi
sleep 1
done < user.txt
需求5:猜数字游戏
1)随机输出一个1-100的数字 echo $(($RANDOM%100+1))
2)要求用户输入的必须是数字(数字处加判断)
3)如果比随机数小则提示比随机数小了 大则提示比随机数大了
4)正确则退出 错误则继续死循环
5)最后统计猜了多少次(猜对了多少次,失败多少次)
[root@manage while]# cat while-13.sh
#!/bin/bash
SJ=$((RANDOM%100+1))
i=1
while true
do
read -p "请输入你要猜的数字:" Action
if [ $Action -eq $SJ ];then
echo "恭喜你,猜对了"
break
elif [ $Action -lt $SJ ];then
echo "猜小了"
else
echo "猜大了"
fi
let i++
done
echo "你总工猜了$i次,失败了$(($i-1))次"
[root@manage while]# sh while-13.sh
请输入你要猜的数字:18
猜大了
请输入你要猜的数字:8
猜大了
请输入你要猜的数字:4
猜大了
请输入你要猜的数字:2
恭喜你,猜对了
你总工猜了4次,失败了3次
需求6:在一个2000多行数据文件,然后有10个新的文件,1-5行数据放到第一个文件里,6-10行数据 放到第二个文件里…46-50数据放到第10个文件里。然后51-55数据在放到第一个文件里。如何实现?
#创建文件
seq 2000 > file.txt
[root@manage while]# cat while-14.sh
#!/bin/bash
while true
do
for i in $(seq 10)
do
head -5 file.txt >> file_$i.txt
sed -i '1,5d' file.txt
if [ ! -s file.txt ];then
exit
fi
done
done
#另一种写法
#!/bin/bash
a=0
b=0
while [ $b -lt 2000 ]
do
file=num.txt
while [ $a -lt 10 ]
do
a=$[$a+1]
b=$[$b+5]
echo "$a $b"
line=$(awk "NR==$[$b-4],NR==$b" $file)
echo "$line">>${a}.txt
done
a=0
done