shell脚本——编程之循环语句(for、while、until)
- 一、输出字符串或提取Shell变量的值——echo命令
- 二、for循环语句
- 三、while循环
- while 猜数字小游戏
- 四、until 循环语句结构
- 【扩充】
- break 和 cotinue 命令
一、输出字符串或提取Shell变量的值——echo命令
echo [参数] [字符串]
转义符 号 | 含义 |
-n | 表示输出不换行 |
-E | 禁止反斜杠转义,与-e参数功能相反 |
-e | 输出转义字符,将转义后的内容输出到屏幕上 |
\b | 相当于退格键,但前提是“\b”后存在字符;“\b"表示删除前一个字符;”\b\b"表示删除前两个字符 |
\c | 不换行输出。后面无字符时相当于 echo -n;"\c"后有字符时,将不被输出 |
\n | 换行,但是换行后的新行从“\n”处开始另起一行 |
\f | 换行,但是换行后的新行的开头位置连接着上一行的行尾 |
\v | 与\f相同 |
\t | 转义后表示插入tab,即横向制表符 |
\r | 光标移至行首,但不换行,相当于使用“\r”以后的数字覆盖之前相等长度的字符 |
| 表示插入“\”本身 |
案例一:echo -n 不换行输出
#!/bin/bash
echo k
echo i
echo r
echo o
echo "......"
echo -n k
echo -n i
echo -n r
echo -n o
案例二:echo -e 转义字符;\b 退格 不换行输出
案例三:echo -e \c不换行输出
案例四: \n 换行输出
案例五:\f 、\v换行输出
案例六:\r光标移至行首不换行
案例七:删除字符的方法:
二、for循环语句
读取不同的变量值,用来逐个执行同一组命令
- 用法:
读取不同的变量值,用来逐个执行同一组命令
for循环经常使用在已经知道要进行多少次循环的场景
- 格式:
for 变量名 in 取值列表
do
命令序列
done
案例一:循环出0到10之间的整数
法一:
#!/bin/bash
for i in {1..10}
do
echo $i
done
法二:
#!/bin/bash
for i in $(seq 1 10)
do
echo $i
done
案例二:查看当前目录下所有内容
[root@Kiro shell]# for k in *;do echo $k;done
for.sh
sum.sh
teacher.sh
test.sh
test.txt
user.sh
vars.sh
案例二:查看当前目录下所有内容
案例三:求20以内偶数和
#!/bin/bash
sum=0
for i in {2..20..2}
do
sum=$[sum+i]
let i++
done
echo "20以内的偶数和为:$sum
案例四:批量创建用户并修改密码
#!/bin/bash
for user in {1..3}
do
echo user${user}|xargs -n1 useradd
echo "123456"|passwd --stdin user${user}
done
案例五:根据ip地址列表检查主机状态
#!/bin/bash
IPLIST=$(cat /root/shell/ip.txt)
for IP in $IPLIST
do
ping -c 3 -i 0.5 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "host $IP is up."
else
echo "host $IP is down."
fi
done
案例六:三次机会验证密码
#!/bin/bash
init=123456
for i in {1..3}
do
read -p "请输入密码:" pass
if [ $pass == $init ];then
echo "密码正确"
exit
fi
done
抽奖小游戏
#!/bin/bash
a=0
b=0
c=0
d=0
for ((i=1;i<=10;i++))
do
num=$(expr $[RANDOM%4+2])
LIST=$(cat /root/shell/users.txt |grep "$num" | awk -F: '{print $2}' )
case $LIST in
huahua)
let a++
;;
duoduo)
let b++
;;
sansan)
let c++
;;
*)
let d++
esac
echo "$LIST"
done
echo "huahua: $a 次,duoduo: $b 次,sansan $c 次,其他: $d 次"
画星星
#!/bin/bash
read -p "请输入你想要的星星规则:" start
for ((i=1;i<=start;i++))
do
for ((j=1;j<=$start;j++))
do
echo -n "*"
done
echo
done
九九乘法表
#!/bin/bash
for i in {9..1..-1}
do
for j in `seq $i`
do
echo -e -n "${i}x${j}=$[ $i * $j ]\t"
done
echo
done
三、while循环
只要条件成立,则反复循环,不成立即停止
while 条件测试操作
do
命令序列
done
案例1:利用while循环打印一个5x5的*
#!/bin/bash
i=1
j=1
while [ $i -le 5 ]
do
while [ $j -le 5 ]
do
echo -n "* "
let j++
done
echo
let i++
let j=1
done
案例二:批量添加规律编号用户
#!/bin/bash
NAME="user"
i=1
while [ $i -le 20 ]
do
useradd ${NAME}$i
echo "123456" |passwd --stdin ${NAME}$i &>/dev/null
let i++
done
附赠一个批量删除:
#!/bin/bash
cd /home
i=1
NAME="user"
while [ $i -le 20 ]
do
userdel -r ${NAME}$i
let i++
done
while 猜数字小游戏
#!/bin/bash
pc_num=$[RANDOM%3+1]
count=0
while true
do
read -p "请输入一个数字:" user_num
if [ $user_num -eq $pc_num ]
then
echo "答对啦"
break
elif [ $user_num -gt $pc_num ]
then
echo "你的数字太大了"
else
echo "你的数字太小了"
fi
let count++
done
echo 你输入的次数为:$count
四、until 循环语句结构
重复测试某个条件,只要条件不成立则反复循环
while 条件测试操作
do
命令序列
done
案例:求50到100的和
#!/bin/bash
sum=0
i=50
until [ $i gt 100]
do
sum=$[sum+i]
let i++
done
echo "{50..100}的和:$sum"
【扩充】
break 和 cotinue 命令