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

时间:2021-07-19 16:32:19   收藏:0   阅读:0

一、echo的用法

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

技术图片

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

常见的转义字符有:

2.1  \b 相当于退格键

转义后相当于退格键(backspace),但是前提是“\b”存在字符。“\b”表示删除前一个字符,“\b\b”表示删除前面两个字符

技术图片

2.2  \c 不换行输出

不换行输出,在“\c”后面不存在字符的情况下,作用相当于echo -n,但是当“\b”后面仍然存在字符时,“\c”后面的字符将不会被输出

技术图片

2.3  \n 换行输出

换行输出,被输出的字符从"\n"出开始另起一行

技术图片

2.4   \f 、\v 换行输出

换行输出,但是换行后新行的开头位置连接着上一行的行尾

技术图片

2.5   \t 制表符显示

转义后表示插入横向制表符,即tab

技术图片

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

光标移至行首,但是不换行,相当于使用“\r”之后的字符覆盖“\r”之前同等长度的字符,但是当“\r”后面不存在任何字符时,“\r”前面的字符不会被覆盖;当“\r”后面存在的字符大于前面时,“\r”前面的字符全部会被后面替代

 技术图片

2.7   \\ 表示符号本身

在转义符前面加入转义符,代表将后面的转义符转义为符号本身,也就是 \ 

技术图片

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

2.8.1 删除字符串内容

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

echo ${i%%, *}
a
//从最后倒数到最长的匹配部分(用%)后面的逗号的地方都被删除

echo ${i#*,}
b,c,d
//从开头到最短的匹配部分(用#)后面的逗号的地方被删除

echo ${i##*, }
d
//从开头到最长的匹配部分(用##)后面的逗号的地方被删除

技术图片  

2.8.2 截取字符串内容

技术图片

2.8.3 增加字符串内容

技术图片

二、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、  实例操作一

取值列表的多种表示方法

技术图片

技术图片  

for循环可在同一行表示

 技术图片

for循环中,do done的相同作用的表示方法

技术图片

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

 

技术图片

技术图片

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

 

技术图片

三、while循环(迭代)

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

1.格式:

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

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

技术图片  

 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

  

技术图片

技术图片

四、until循环

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

1、格式

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

技术图片  

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"

  

技术图片

3、实例操作二:为指定用户发送在线消息

(1)若用户不在线(未登陆系统),则每3秒试一次,直至用户登录系统后在发送信息
(2)用户名与消息通过位置参数传递给脚本

#!/bin/bash
#Send an online message for a specified user

username=$1
if [ $# -lt 1 ];then
   echo "Usage:`basename $0` <username> [<message>]"
   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

  

技术图片

技术图片

五、总结

1、echo 的用法

echo -n 表示不换行输出

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

2、for 循环(遍历)

3、while循环(迭代)

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

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!