shell脚本—While循环

shell脚本—While循环

文章目录

  • shell脚本—While循环
    • 1.While循环基本概述
    • 2.while循环练习
    • 3.循环中的控制语句
    • 4.循环控制语句练习

1.While循环基本概述

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,一直输出

2.while循环练习

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

3.循环中的控制语句

# 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
结束

4.循环控制语句练习

需求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

你可能感兴趣的:(Shell脚本,linux)