shell的循环
一、for循环
(一)for循环
for循环,又有人称之为条件循环,或者for i in ,其实就是for循环的特性,次数和给与的条件是成正比的
for语句结构
读取不同的变量值,用来逐个执行同一组命令
for 变量名 in 取值列表
do
命令序列
done
遍历
for i in {
1..10} 迭代加1 | {
1..10..2} 迭代,每次循环加2
或 $(seq 1 10) | $(seq 1 2 10)
或for ((i=1; i<=10; i++)) | ((i=1; i<=10; i+=2))
do
echo $i
done
#/bin/bash
#1-10
for ((i=1; i<=10; i++)) 或$(seq 1 10)或者for i in {
1..10}
do
echo $i
done
例题1(批量创建用户)
1.创建包含用户名的文件
2.编写脚本
#/bin/bash
#passwd
a=$(cat name.txt)
for i in a
do
useradd $i
echo "1234" | passwd --stdin $i
或echo -e "1234\n1234\n" | passwd $i // 或这使用\n代表回车键
done
3.验证
例题二(测试主机连通性)
#!/bin/bash
#ping范围主机
for i in 172.16.100.{
1..20}
do
ping -c 3 -i 0.5 -W 2 $i &> /dev/null
if [ $? = 0 ]
then
echo "$i online"
else
echo "$i offline"
fi
done
有多个for例题在之前的文章里有介绍链接
二、while循环
(一)先看例题在学内容
猜价格游戏
方法一:不使用break循环
price=$[$RANDOM % 1000]
a=0
times=0
echo "猜猜商品价格是多少"
while [ $a -eq 0 ]
do
let times++
read -p "请输入你猜的价格:" b
if [ $b -eq $price ];then
echo "yes!"
let a++
elif [ $b -gt $price ];then
echo "你猜大了!"
elif [ $b -lt $price ];then
echo "你猜小了!"
fi
done
echo "你总共猜了 $times 次"
方法二:
#!/bin/bash
#猜价格
let a=$RANDOM%1000
b=0
d=0
while yes!
do
read -p "输入价格" c
if [ $c = $a ]
then
echo "yes"
break
elif [ $c -lt $a ]
then
echo "太低了"
else
echo "太高了"
fi
let d++
done
echo "你输入多少次 $d"
(二)while循环
只要条件成立,则反复循环,不成立即停止
1、while语句结构
while 条件测试操作
do
命令序列
done
#/bin/bash #/bin/bash
#example #example
i=0 注 i=0
while (( $i <= 10 )) 意 while [ $i -eq 10 ]
do 区 do
echo "$i" 别 let i++
let i++ echo "$i"
done done
第一个脚本输出0—10的内容,第二个脚本输出1—11的内容
(注意迭代的位置)
(三)例题二
批量添加以stu开头的5个用户;stu1—stu5,初始密码1234
#/bin/bash
#useradd
i=0
while [ $i -le 4 ]
do
let i++
useradd stu$i
echo "1234" | passwd --stdin stu$i
done
三、until(反while循环)
(一)until
重复测试某个条件,只要条件不成立则反复循环
1、until语句结构
until 条件测试操作
do
命令序列
done
显示1—10的整数
i=1
until [ $i -gt 10 ] //i的值大于等10 不满足i>10的情况下执行循环
do
echo "$i"
let i++
done
(二)例题一
计算1—50的整数和
#/bin/bash
#sum 1-50
i=1
sum=0
until [ $i -gt 50 ]
do
sum=$(($sum+$i))
let i++
done
echo "$sum"
四、两种中断(break和continue)
break跳出单个循环;continue中止某次循环中的命令,但不会完全中止整个命令
for i in {
1..5}
do
echo "外层循环 $i"
for b in {
1..5}
do
if [ $b -eq 3 ]
then
break //break2则也停止外层循环
fi
echo "内层循环 $b"
done
done
continue
for i in {
1..5}
do
echo "外层循环 $i"
for b in {
1..5}
do
if [ $b -eq 3 ]
then
continue
fi
echo "内层循环 $b"
done
done
五、常见的转以字符
cho -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
- \b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符
- \c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出
- \n 换行,被输出的字符从"\n"处开始另起一行
- \f 换行,但是换行后的新行的开头位置连接着上一行的行尾
- \v 与\f相同
- \t 转以后表示插入tab,即横向制表符
- \r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
- \ 表示插入""本身;
六、IFS字段分割符
默认包含空格,制表符,换行符 set | grep IFS
1.修改
IFS=$'\t\n'
修改成只换行
IFS=$'\n'
IFS=':'
IFS=','
2.备份
IFS. OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD
(一)例题
输出环境变量PATH所包含的所有目录以及其中的所有可执行文件
for写法
#/bin/bash
OLDIFS=$IFS ///备份IFS参数
IFS=':' ///以:分割的字段输出,这样i就可以按字段取值
for i in $PATH
do
for a in $i/*
do
if [ -x $a -a -f $a ];then
echo "$a 文件有执行权限"
fi
done
done
IFS=$OLDIFS ///还原IFS默认值