Shell脚本之——循环语句(for、while、until详解)
一、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循环相反