一、格式

while       条件                      
do
循环体
done
 
# 条件为真的情况下,会循环,为假就停止循环
# 循环次数可以固定,也可以不固定
 

有限循环
# /bin/bash

i=0
while [ $i -le 10 ]
do
    echo $i
    i=$[$i+1]

done

死循环(条件永远成立)
# /bin/bash

i=0
while [ $i -ge 0 ]
do
    echo $i
    i=$[$i+1]

done

---

while  :  等于   while true


在死循环中通过其他机制中断循环
# /bin/bash

i=0
while [ $i -ge 0 ]
do
   if [ $i -lt 1000  ];then
        echo $i
        i=$[$i+1]
   else
        exit
   fi

done

举例1:点名脚本

# vim user.txt
zhangsan
lisi
wangwu
tom
jerry
boss
ikun

---

#! /bin/bash
#read -p "随机抽取几位同学:" name

i=0
n=""
while [ $i -lt $1 ]
do
   num=$[$RANDOM%18+1]
   n1=`head -n $num /root/user.txt | tail -1`
   echo $n | grep -w $n1 &> /dev/null
   if [ $? -ne 0  ];then
       n="$n $n1"
       let i++
   fi
done

echo "$n"

 

举例2:双色球

#! /bin/bash
i=0
red=""
while [ $i -lt 6 ]
do
   n1=$[$RANDOM%33+1]
   echo $red | grep -w $n1 &> /dev/null
   if [ $? -ne 0  ];then
       red="$red $n1"
       let i++
   fi
done

echo "红球:$red"
blue=$[$RANDOM%16+1]
echo "蓝球: $blue"

#带颜色输出
echo -e "\033[31m红球:$red \033[0m"
blue=$[$RANDOM%16+1]
echo -e "\033[34m蓝球: $blue\033[0m"

---

shell脚本中echo显示内容带颜色显示,需要使用到-e参数
格式1:echo -e “\033[背景颜色;字体颜色m 要输出的字符 \033[0m”
格式2:echo -e “\e[背景颜色;字体颜色m 要输出的字符 \e[0m”

echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”

控制选项:
\033[0m:关闭所有属性
\033[1m:高亮显示,加粗
\033[5m:闪烁

二、while read line

结构:一行一行读取文件内容
while read line
do
echo $line
done < /root/user_list

举例:

# vim list.txt 
tom 123
jerry 456
zhangsan 123456
lisi 123
wangwu 123

批量创建用户,并设置密码
#!/bin/bash

while read line
do
   username=`echo $line | awk -F" " '{print $1}'`
   password=`echo $line | awk -F" " '{print $2}'`

   useradd $username &> /dev/null

   echo $password | passwd --stdin $username &>/dev/null

   if [ $? -eq 0 ];then
     echo -e "$username 用户已创建,已设置密码\n"
   fi
done < /root/list.txt

 三、until循环

until 条件 
do
循环体
done

与whlie循环相反,当后面的条件表达式,为假的时候进行循环,当他为真了就停止循环了