目录
1.1. for循环
1.1.1. 带列表的for循环
1.1.2. 不带列表的for循环
1.1.3. 基于C语言风格的for循环
1.2. while循环
1.2.1. 格式
1.2.2. while循环读取文件
1.3. until循环
1.3.1. 作用
1.4. 循环控制
1.4.1. 组成
1.4.2. 详细语法:
1.4.3. 示例
1.4.4. 循环嵌套
1.1. for循环
for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循
环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或
者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不
带列表的for循环以及类C风格的for循环。本节将介绍这3种不同的for循环结构。
1.1.1. 带列表的for循环
格式:
for variable in {list}
dostatement1statement2...
done
分析
variable称为循环变量
list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句
例1:
[root@server ~]# vim for1.sh
#!/bin/bash
for IP in 192.168.223.129 192.168.223.130 192.168.223.131
doecho $IP
done[root@server ~]# bash for1.sh
[root@server ~]# vim for2.sh
#!/bin/bashfor IP in 192.168.223.{129..135}
doecho $IP
done
例2:获取目录下所有目录的文件名
shell允许用户指定for语句的步长,格式如下
# ls -F 用于将目录内的文件按照文件类型归类显示,会在不同类别的文件尾部增加
不同的标识符,目录以/结尾,链接文件以@结尾,可执行文件以*结尾
# grep /$:表示过滤以/结尾的内容
[root@server ~]# vim for3.sh
#!/bin/bashfor FILE in $(ls -F / | grep /$)
doecho $FILE
done
shell允许用户指定for语句的步长,格式如下
for variable in {start..end..step}
dostatement1statement2...
done
例3:计算1+3+5+7+9+……+99之和
[root@server ~]# vim for4.sh
#!/bin/bashsum=0
for i in {1..99..2}
dolet sum=sum+i
done
echo "sum=$sum"
1.1.2. 不带列表的for循环
原则:for不提供循环列表,shell将从命令行获取循环列表数据及条件,格式:
for variable
dostatement1statement2...
done
由于系统变量$@可以获取所有位置参数,以上的语法等价于:
for variable in $@或$*
dostatement1statement2...
done
例4:
[root@server ~]# vim for5.sh
#!/bin/bashfor arg
doecho $arg
done
[root@server ~]# bash for5.sh {1..10}
1.1.3. 基于C语言风格的for循环
格式
for ((初始化;条件表达式;步长)) # 注意:2个园括号
dostatement1statement2...
done
例5:面试题:批量创建用户
#!/bin/bash#批量创建账户for((i=1;i<=10;i++))
doif ! id -u temp$i &> /dev/nullthenuseradd temp$iecho "123" | passwd --stdin temp$i &> /dev/nullelseecho "temp$i is exists......"fi
done
注意:i++表示置后自增,++i置前自增
[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo $((x++))
1
[root@server ~]# echo $((++y))
3
1.2. while循环
1.2.1. 格式
while expression
dostatement1statement1……
done
上例语法中,expression表示条件表达式,循环必须满足该表达式,否则循环结束,可以是任何符合语法的shell命令,但推荐书写测试表达式
1.2.2. while循环读取文件
# 法1 ,采用exec读取文件
[root@server ~]# vim file1.txt
data1
data2
data3
data4
data5
#!/bin/bashexec < file1.txtwhile read a
doecho $a
done
# exec < file1.txt 将file.txt文件内容读入到标准输入中
# read a 表示从标准输入中按照行读取内容到变量a
# 法2:使用cat读取文件,通过管道符进入while循环处理cat 文件名 | while read line
dostatement1statement1……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while read line
dostatement1statement1……
done < 文件名
1.2.3. while语句示例
例1:猜测商品价格,通过变量RANDOM获取随机整数并控制在20以内,提示用户猜测商品价格,猜测时需要记录次数,猜中后退出程序
#!/bin/bash#猜测商品价格,随机控制在20以内,计算猜测次数PRICE=$[ $RANDOM%20 ] # 产生随机数控制在20以内count=0while true # 恒真执行
doread -p "请输入[0-20]间的商品价格" INT let count++if (($INT==$PRICE)) thenecho "恭喜你猜对了"echo "你使用了$count 次机会"exit 0 # 退出程序,返回0状态elif (($INT>$PRICE))thenecho "你输入的商品价格高了"elseecho "你输入的商品价格低了"fi
done
1.3. until循环
1.3.1. 作用
until循环不断地重复执行循环中的语句,直至某个条件不成立
until expreession
dostatement1statement2……
done
expression是一个条件表达式,值不为0时,执行do与done之间的语句,值为0时退出until循环
1.3.2. 示例
例2:将例5中改写为删除账户
#!/bin/bashi=1until [ $i -gt 10 ]
doif id -u temp$i &> /dev/nullthenuserdel -r temp$ielseecho "temp$i is not exists...."filet i++
done
1.4. 循环控制
1.4.1. 组成
break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中
continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行
1.4.2. 详细语法:
1.4.3. 示例
例1:判断素数
#!/bin/bash#判断素数read -p "请输入一个大于2的整数:" primeif ((prime<2))
thenecho "数据错误,请输入大于等于2的整数"
elsefor((i=2;i<prime;i++))doif ((prime%i==0))thenecho "平数"breakfi doneif ((i==prime))then echo "素数"fi
fi
例2:计算100到150之间不能被3整除的数,输出时一行显示5个
#!/bin/bash#计算100到150之间不能被3整除的数,一行打印5个count=0for ((i=100;i<=150;i++))
doif ((i%3==0))thencontinuefiecho -ne "$i\t"((count++))if ((count%5==0))thenechofi
done
echo
1.4.4. 循环嵌套
例1:打印九九乘法表
#!/bin/bashfor i in $(seq 9)
dofor j in `seq 9`do((j<=i)) && echo -ne "$i*$j = `echo $((i*j))`\t"doneecho
done
例2:打印三角形
#!/bini/bash#打印数字组成的三角形for ((i=1;i<10;i++))
dofor ((j=1;j<=10-i;j++))doecho -n " " donefor ((k=1;k<=i;k++))doecho -n "$i "doneecho
done