Shell脚本之——循环语句(for、while、until详解)

文章目录

  • 一、echo的用法
    • 1.1、echo -n 表示不换行输出
    • 1.2、echo -e 输出转义字符,将转义后的内容输出到屏幕上
      • 1.2.1 \b 相当于退格键
      • 1.2.2 \c 不换行输出
      • 1.2.3 \n 换行输出
      • 1.2.4 \f 、\v 换行输出
      • 1.2.5 \t 制表符显示
      • 1.2.6 \r 光标移至行首不换行
      • 1.2.7 \\ 表示符号本身
      • 1.2.8 echo 的其他用法,删除和获取字符串的内容
  • 二、for循环(遍历)
    • 1、 格式
    • 2、 实例操作一
  • 三、while循环(迭代)
    • 1.格式
    • 2、实例操作
  • 四、until循环
    • 1、格式
    • 2、实例操作
  • 五、总结

一、echo的用法

1.1、echo -n 表示不换行输出

Shell脚本之——循环语句(for、while、until详解)_第1张图片

1.2、echo -e 输出转义字符,将转义后的内容输出到屏幕上

常见的转义字符有:

1.2.1 \b 相当于退格键

转义后相当于退格键(backspace),但是前提是“\b”存在字符。“\b”表示删除前一个字符,“\b\b”表示删除前面两个字符
Shell脚本之——循环语句(for、while、until详解)_第2张图片

1.2.2 \c 不换行输出

不换行输出,在“\c”后面不存在字符的情况下,作用相当于echo -n,但是当“\b”后面仍然存在字符时,“\c”后面的字符将不会被输出
Shell脚本之——循环语句(for、while、until详解)_第3张图片

1.2.3 \n 换行输出

换行输出,被输出的字符从"\n"出开始另起一行
Shell脚本之——循环语句(for、while、until详解)_第4张图片

1.2.4 \f 、\v 换行输出

换行输出,但是换行后新行的开头位置连接着上一行的行尾
Shell脚本之——循环语句(for、while、until详解)_第5张图片

1.2.5 \t 制表符显示

转义后表示插入横向制表符,即tab
Shell脚本之——循环语句(for、while、until详解)_第6张图片

1.2.6 \r 光标移至行首不换行

光标移至行首,但是不换行,相当于使用“\r”之后的字符覆盖“\r”之前同等长度的字符,但是当“\r”后面不存在任何字符时,“\r”前面的字符不会被覆盖;当“\r”后面存在的字符大于前面时,“\r”前面的字符全部会被后面替代
Shell脚本之——循环语句(for、while、until详解)_第7张图片

1.2.7 \ 表示符号本身

在转义符前面加入转义符,代表将后面的转义符转义为符号本身,也就是 \
Shell脚本之——循环语句(for、while、until详解)_第8张图片

1.2.8 echo 的其他用法,删除和获取字符串的内容

删除字符串内容

i=`echo  "a,b,c,d"
echo ${i%, *}
a,b,c
//从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除
 
echo ${i%%, *}
a
//从最后倒数到最长的匹配部分(用%)后面的逗号的地方都被删除
 
echo ${i#*,}
b,c,d
//从开头到最短的匹配部分(#)后面的逗号的地方被删除
 
echo ${i##*, }
d
//从开头到最长的匹配部分(##)后面的逗号的地方被删除

Shell脚本之——循环语句(for、while、until详解)_第9张图片
截取字符串内容
Shell脚本之——循环语句(for、while、until详解)_第10张图片
增加字符串内容
Shell脚本之——循环语句(for、while、until详解)_第11张图片

二、for循环(遍历)

1、 格式

for  变量名  in  取值列表
do
    命令序列
done
for i in {1..10}         {1..10..2}
 
for i in $(seq 1 10)     $(seq 1 2 10)
 
for ( (i=1; i<=10; i++) )  ( (i=1; i<=10; i+=2) )
do
   echo  $i
done
 
for ( (i=1; i<=10; i++)) ;do echo $i ;done  

2、 实例操作一

取值列表的多种表示方法
Shell脚本之——循环语句(for、while、until详解)_第12张图片
Shell脚本之——循环语句(for、while、until详解)_第13张图片
for循环可在同一行表示
Shell脚本之——循环语句(for、while、until详解)_第14张图片
for循环中,do done的相同作用的表示方法
Shell脚本之——循环语句(for、while、until详解)_第15张图片
3、 实例操作二:批量添加用户

#!/bin/bash
#Batch add users
 
for i in `cat /root/users.txt`
do
  useradd $i &> /dev/null
  echo "123456" |passwd --stdin $i &> /dev/null
done

Shell脚本之——循环语句(for、while、until详解)_第16张图片
Shell脚本之——循环语句(for、while、until详解)_第17张图片
4、 实例操作三:根据IP地址检查主机状态

#!/bin/bash
#Check host status based on IP address
 
for i in `cat /root/ipadds.txt`
do
  ping -c 3 -i 0.5 -w 2 $i &> /dev/null
  if [ $? -eq 0 ];then
     echo "$i is online"
  else
     echo "$i is offline"
  fi
done

Shell脚本之——循环语句(for、while、until详解)_第18张图片

三、while循环(迭代)

while循环可以不断的执行某个程序,直到用户设置的条件完成为止,所以重点是条件,这种不定循环最常见的就是下面这两种格式了。

1.格式

while循环:while的中文是【当…时】,所以这种方式说的是,当判断式/命令序列的条件成立时,就进行循环,直到命令序列/程序段落的条件不成立才停止。

while  [ 条件测试操作 ]
do                      #do代表循环的开始
    判断式/命令序列
done                    #done代表循环的结束

Shell脚本之——循环语句(for、while、until详解)_第19张图片

2、实例操作

一:批量添加用户,并设置密码为123456

#!/bin/bash
#Batch add users
 
a=1
while [ $a -le 20 ]
do
   useradd stu$a
   echo "123456" | passwd --stdin stu$a &> /dev/null
let a++
done
~        

3、实例操作二:猜价格游戏,要求在0-999数字范围内猜价格,并有提示信息,统计最终猜测的次数

#!/bin/bash
#The price guessing game
 
a=0
b=0
price=$(echo $[RANDOM%1000])
while [ $a -eq 0 ]
do
   read -p "请输入你猜的价格:" num
   if [ $price -eq $num ];then
       let b++
       echo "恭喜你猜对了,你一共猜了 $b 次!"
       let a++
   elif [ $num -lt $price ];then
       let b++
       echo "猜低了,再接再厉!"
   else
       let b++
       echo "猜高了,再接再厉!"
   fi
done

Shell脚本之——循环语句(for、while、until详解)_第20张图片
Shell脚本之——循环语句(for、while、until详解)_第21张图片

四、until循环

这种方式恰恰和while循环相反,它指的是当判断式/命令序列的条件成立时,就终止循环,否则就会持续循环程序段落。

1、格式

until  [ 条件测试操作 ]
do
    判断式/命令序列
done

Shell脚本之——循环语句(for、while、until详解)_第22张图片

2、实例操作

计算1-50的和

#!/bin/bash
#Calculate the sum from 1 to 50
 
a=1
b=0
until [ $a -gt 50 ]
do
   b=$(($b+$a))
 
   let a++
done
   echo "得出的和为:$b"

Shell脚本之——循环语句(for、while、until详解)_第23张图片
3、实例操作二:为指定用户发送在线消息
(1)若用户不在线(未登陆系统),则每3秒试一次,直至用户登录系统后在发送信息
(2)用户名与消息通过位置参数传递给脚本

#!/bin/bash
#Send an online message for a specified user
 
username=$1
if [ $# -lt 1 ];then
   echo "Usage:`basename $0`  []"
   exit 1
fi
#判断用户是否存在。如果存在则不进行任何操作
if grep "^$username:" /etc/passwd > /dev/null;then :
else
   echo "$username is not a user on this system"
   exit 2
fi
#判断用户是否在线,若不在线则每3秒联系一次
until who|grep "$username" > /dev/null;do
     echo "$username is not logged on"
     sleep 3
done
#shift去除第一个参数,$*为所有参数的值
shift;msg=$*
#判断$msg是否为空,为空则赋值
[[ "X"$msg == "X" ]] && msg="Are you ready? $username"
#通过write命令给用户发送消息
echo "$msg"| write $username

Shell脚本之——循环语句(for、while、until详解)_第24张图片
Shell脚本之——循环语句(for、while、until详解)_第25张图片

五、总结

1、echo 的用法

echo -n 表示不换行输出

echo -e 输出转义字符,将转义后的内容显示在屏幕上(\b \c \n \f \t \r \)

2、for 循环(遍历)

3、while循环(迭代)

4、unitl循环——与while循环相反

你可能感兴趣的:(linux)