华子目录
- for循环
- 带列表的for循环
- 格式
- 分析
- 示例
- shell允许用户指定for语句的步长,格式如下
- 示例
- 不带列表的for循环
- 示例
- 基于C语言风格的for循环
- 格式
- 示例
- 注意
- while循环
- 格式
- 示例
- until循环
- 作用
- 格式
- 示例
- 循环控制
- break
- continue
- 详细语法
- 示例
- 循环嵌套
- 示例
for循环
- for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。本节将介绍这3种不同的for循环结构。
带列表的for循环
格式
for 循环变量 in {list}
do
statement1
statement2
...
done
分析
- variable称为循环变量
- list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
- do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
- 执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句
示例
[root@server ~]# vim for1.sh
#!/bin/bash
for ip in 192.168.80.129 192.168.80.130
do
echo $ip
done
[root@server ~]# bash for1.sh
192.168.80.129
192.168.80.130
[root@server ~]# vim for2.sh
#!/bin/bash
for ip in 192.168.80.{120..140..1} # 使用{start..end..step} 进行扩展
do
echo $ip
done
[root@server ~]# bash for2.sh
192.168.80.120
192.168.80.121
192.168.80.122
192.168.80.123
192.168.80.124
192.168.80.125
192.168.80.126
192.168.80.127
192.168.80.128
192.168.80.129
192.168.80.130
192.168.80.131
192.168.80.132
192.168.80.133
192.168.80.134
192.168.80.135
192.168.80.136
192.168.80.137
192.168.80.138
192.168.80.139
192.168.80.140
- 获取指定目录下的所有目录的文件名
[root@server ~]# vim for3.sh
#!/bin/bash
for file in $(ls -F / | grep "/$")
do
echo $file | cut -d "/" -f1
done
# ls -F :用于将目录内的文件按照文件类型进行归类显示,会在不同类别的文件名尾部增加不同的标识符,目录以/结尾、链接文件以@结尾、可执行文件以*结尾、普通文件无符号
# grep "/$" :表示过滤以/结尾的行
[root@server ~]# bash for3.sh
afs
boot
dev
etc
home
media
mnt
opt
proc
root
run
srv
sys
tmp
usr
var
shell允许用户指定for语句的步长,格式如下
for variable in {start..end..step}
do
statement1
statement2
...
done
示例
- 例3:计算1+2+3+4+5+……+100和
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do
((sum=$sum+$i))
done
echo "sum=$sum"
[root@server ~]# bash for4.sh
sum=5050
# 上例修改
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in $(seq 100)
do
((sum=$sum+$i))
done
echo "sum=$sum"
[root@server ~]# bash for4.sh
sum=5050
不带列表的for循环
- 原则:for不提供循环列表,shell将从命令行(相当于以位置参数的形式传入循环列表)获取循环列表数据及条件,格式:
for variable
do
statement1
statement2
...
done
- 由于系统变量$@可以获取所有位置参数,以上的语法等价于:
for variable in $@或$*
do
statement1
statement2
...
done
示例
[root@server ~]# vim for5.sh
#!/bin/bash
for arg
do
echo $arg
done
[root@server ~]# bash for5.sh {1..10..2}
1
3
5
7
9
基于C语言风格的for循环
格式
for ((初始化;条件表达式;步长)) # 注意:2个圆括号
do
statement1
statement2
...
done
示例
- 面试题,批量创建账户
[root@server ~]# vim for6.sh
#!/bin/bash
for((i=1;i<=10;i++))
do
if ! id -u temp$i &> /dev/null
then
useradd temp$i
echo "123456" | passwd --stdin temp$i &> /dev/null
else
echo "temp$i 账户已存在"
fi
done
[root@server ~]# bash for6.sh
[root@server ~]# id temp1
用户id=1001(temp1) 组id=1001(temp1) 组=1001(temp1)
注意
i++表示置后自增,++i置前自增
[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo $((++y))
3
[root@server ~]# echo $y
3
while循环
格式
while expression
do
statement1
statement1
……
done
- 上例语法中,expression表示条件表达式,循环必须满足该表达式,否则循环结束,可以是任何符合语法的shell命令,但推荐书写测试表达式
示例
- while循环读取文件
# 法1 ,采用exec读取文件
[root@server ~]# vim file1.txt
data1
data2
data3
data4
data5
[root@server ~]# vim while1.sh
#!/bin/bash
exec < file1.txt
while read a
do
echo $a
done
# exec < file1.txt 将file.txt文件内容读入到标准输入中
# read a 表示从标准输入中按照行读取内容到变量a
[root@server ~]# bash while1.sh
data1
data2
data3
data4
data5
# 法2:使用cat读取文件,通过管道符进入while循环处理
cat 文件名 | while read line
do
statement1
statement1
……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while read line
do
statement1
statement1
……
done < 文件名
- 猜商品价格,通过变量RANDOM获取随机整数并控制20以内,提示用户猜测商品价格,猜测时需要记录次数,猜中后退出程序
[root@server ~]# vim while2.sh
#!/bin/bash
price=$[ $RANDOM%20 ]
count=0
while true
do
read -p "请输入[0-20]间的商品价格: " INT
let count++
if(($INT==$price))
then
echo "恭喜,你猜中!"
echo "你使用了$count次机会"
exit 0
elif (($INT>$price))
then
echo "你输入的商品价格高了!"
else
echo "你输入的商品价格低了!"
fi
done
[root@server ~]# bash while2.sh
请输入[0-20]间的商品价格:10
你输入的商品价格高了
请输入[0-20]间的商品价格:5
你输入的商品价格高了
请输入[0-20]间的商品价格:3
你输入的商品价格高了
请输入[0-20]间的商品价格:2
你输入的商品价格高了
请输入[0-20]间的商品价格:1
你输入的商品价格高了
请输入[0-20]间的商品价格:0
恭喜,你猜中了
你使用了6次机会
until循环
作用
- until循环不断地重复执行循环中的语句,直至某个条件成立,与while循环的执行条件相反
格式
until expreession
do
statement1
statement2
……
done
示例
[root@server ~]# vim while3.sh
# while3.sh 的改写
#!/bin/bash
i=1
until [ $i -gt 10 ] # i>10 ,注意,条件要相反
do
if id -u temp$i &> /dev/null
then
userdel -r test$i
else
echo "test$i 账户已删除"
fi
let i++
done
循环控制
break
break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中
continue
continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行
详细语法
示例
- 判断素数
[root@server ~]# vim for7.sh
#!/bin/bash
read -p "请输入一个正整数: " prime
if ((prime<2))
then
echo "数据错误,请输入大于等于2的正整数!"
else
for ((i=2;i<prime;i++))
do
if ((prime%i==0))
then
echo "平数"
break
fi
done
if ((i==prime))
then
echo "素数"
fi
fi
- 计算100到150之间不能被3整除的数,输出时一行显示5个
[root@server ~]# bash for8.sh
#!/bin/bash
count=0
for((i=100;i<150;i++))
do
if ((i%3==0))
then
continue
fi
echo -ne "$i\t"
((count++))
if ((count%5==0))
then
echo
fi
done
echo
循环嵌套
示例
- 九九乘法表
[root@server ~]# bash for9.sh
#!/bin/bash
for i in $(seq 9)
do
for j in $(seq 9)
do
((j<=i)) && echo -ne "$i*$j=`echo $((i*j))` \t"
done
echo
done
- 打印三角形
[root@server ~]# bash for10.sh
#!/bin/bash
read -p "请输入图形行数:" h
for ((i=0;i<h;i++)) # 循环处理h行
do
for ((j=0;j<h-i;j++)) # 每行打印一些空格
do
echo -n " "
done
for ((k=0;k<2*i+1;k++)) # 每行打印一些星号
do
echo -n "*"
done
echo # 每行最后打印一个\n
done
- 打印数字三角形
[root@server ~]# bash for11.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
for ((j=1;j<=10-i;j++))
do
echo -n " "
done
for ((k=1;k<=i;k++))
do
echo -n "$i"
done
echo
done