shell脚本循环语句之for循环
1、格式
2、常用参数
echo -n :表示不换行输出
echo -e :输出转义字符,把转义后的内容输出到屏幕上
常用的转义字符如下:
\b 转义后相当于按退格键(backspace) ,但前提是“\b”后面存在字符;“\b”表示删除前一个字符
\c 不换行输出,在“\c”后面不存在字符的情况下,作用相当于echo -n ; 但是当“\c”后面仍让存在字符时,“\c”后年的字符将不会被输出。
\n 换行,被输出的字符从“\n”处开另起一行
\f 换行,但是换行后的新行的开头位置连接着上一行的结尾
\v 与\ f 相同原理
\t 转以后表示插入tab , 即横向制表符
\r 光标移至首行,但不换行, 相当于使用“ \r ”以后的字符覆盖“\r”之前同等长度的字符;但是当“\r”后面不存在任何字符时,“\r”前面的字符不会被覆盖
\ 表示插入“\”本身
-
-n演示 引用图
-
echo -e “\b”的用法 引用图
for循环语句
1、for循环的结构
面对列表重复任务时,if语句难以满足需求,按着顺序编写,又非常耗时间,这时候就需要使用循环语句来解决这个问题。
- for语句需要定义一个变量和取值列表,根据不同的取值执行相同的命令,知道变量值用完。
- 取值列表里包含多个属性相同的对象,例如:IP地址,通信录等。
#for语句结构
for 变量名 in 取值列表
do
命令序列
done
示例1:for循环的入门,一般都是从求和开始,下面就先就1~100的和。
#!/bin/bash
#
sum=0
for i in {1..100}
do
sum=$[$i+$sum]
done
echo "0-100的和为:" $sum
#如果算的是1~100之间每个两位数的和,即{1、3、5、7、...、99},for循环如下:
for i in {1..100..2}
#其他都是一样的。
语句示例补充:下面是求1~100的和的不同表达。(都测试过,这里就不再贴图了,想试的可以复制试试)
格式一:
#!/bin/bash
#
sum=0
for i in $(seq 1 100) #{1、3、5、...、99}相加为$(seq 1 2 100)
do
sum=$[$i+$sum]
done
echo "0-100的和为:" $sum
格式二:
#!/bin/bash
#
sum=0
for ((i=1;i<=100;i++)) #隔一个相加, for ((i=1;i<100;i+=2))
do
sum=$[$i+$sum]
done
echo "0-100的和为:" $sum
示例2:批量添加用户,用户名存放在users.txt文件中,每行一个;初始密码均设为123456
#!/bin/bash
#
a=`cat ~/test/users.txt`
for i in $a
do
useradd $i
echo "123456" | passwd --stdin $i &>/dev/null
done
示例3:根据IP地址检查主机状态;IP地址存放在ipadds.txt文件中,每行一个;
#!/bin/bash
#
a=`cat ~/test/ipadds.txt`
for i in $a
do
ping -c 3 -i 0.5 -W 2 $i &>/dev/null
if [ $? -eq 0 ];then
echo "$i 主机在线"
else
echo "$i 主机不在线"
fi
done
二、while循环语句
- 根据特定条件反复执行一个命令序列,直到不满足条件为止
- 编写时可能会出现死循环,要避免这种情况发生
- true(真)和false(假)为特殊条件测试操作,也可以在if语句的条件测试中使用。
(1):true作为条件时,表示条件永远成立,无限执行,也就是死循环,需要强制终止
(2):false作为条件时,表示条件不成立,不执行命令序列
#while语句结构
while 条件测试操作
do
命令序列
done
示例1:批量添加用户; 用户名称以stu开头,按数字顺序进行编号;
一共添加20个用户,即stu1、stu2、......、stu20
初始密码均设为123456
#!/bin/bash
#
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin $i &>/dev/null
let i++
done
示例2:猜商品价格游戏;通过变量RANDOM获得随机数;提示用户猜测并记录次数,猜中后退出循环
#我这里还加了if语句填了一点其他元素。
#!/bin/bash
#
a=$(expr ${RANDOM} % 1000)
i=0
while true
do
read -p "猜猜看我想的是哪个数,范围在0~999。" shu
let i++
if [ $shu -eq $a ];then
if [ $i -le 10 ];then
echo "太强了,你猜了$i 次就猜中了,可惜没得奖励。"
else
echo "猜了$i 次才猜中,你还差的远呢"
fi
exit 0
elif [ $shu -lt $a ];then
if [ $(expr $a - $shu) -le 5 ] ;then
echo "虽然数小了,但已经很近了,你在想想"
else
echo "不好意思,猜的太小了"
fi
else
if [ $(expr $shu - $a) -le 5 ];then
echo "虽然数大了,但已经很近了,你在考虑考虑"
else
echo "不好意思,猜大了,数再小点"
fi
fi
done
三、until循环语句
- 与while相反,重复测试某个条件,只要条件不成立则反复执行。
- 一般熟练运用while即可,这个很少用。
示例:计算1~50的和值;通过循环累加的方式计算1~50的和值
#!/bin/bash
#
a=0
sum=0
until [ $a -gt 100 ]
do
sum=$[$sum+$a]
let a++
done
echo "1-100的和为:$sum"
四、结束循环------break和continue
- break跳出单个循环
#!/bin/bash
for ((a=1; a<=5; a++))
do
echo "outer loop: $a"
for ((b=1; b<=50; b++))
do
if [ $b -eq 5 ]
then
break
fi
echo "inter loop: $b"
done
done
- continue中止某次循环中的命令,但不会完全中止整个命令
#!/bin/bash
for ((a=1; a<=15; a++))
do
if [ $a -gt 5 ] && [ $a -lt 10 ]
then
continue
fi
echo "current value: $a"
done
五、 IFS字段分隔符(补充)
默认包含 空格,制表符,换行符
查看命令:set | grep IFS
IFS=$' \t\n'
修改成只换行
IFS=$'\n'
IFS=:
IFS=','
IFS.OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD
输出环境变量PATH所包含的所有目录以及其中的所有可执行文件