一. 简介
Shell 编程中循环命令用于特定条件下决定某些语句重复执行的控制方式, 在编程语言中, 循环语句是最基本的语法之一, 在 Shell 中也不例外. Shell 中的循环语句一般有 for,while,until 这几种, 偶尔还有写错语法的时候, 这里结合实例来自己总结一下. 也为今后使用提供一个快捷的资料获取渠道. 有三种常用的循环语句: for,while 和 until.while 循环和 for 循环属于 "当型循环", 而 until 属于 "直到型循环".
二. 详解
1.for 循环
for 变量名 in 列表; do
循环体
done
其中; 可以换成回车, 效果一样的
(1)最基本的 for 循环
- #!/bin/bash
- for varible1 in {1..5};do
- echo "Hello, Welcome $varible1 times"
- done
do 和 done 之间的命令称为循环体, 执行次数和 list 列表中常数或字符串的个数相同. for 循环, 首先将 in 后 list 列表的第一个常数或字符串赋值给循环变量, 然后执行循环体, 以此执行 list, 最后执行 done 命令后的命令序列.
Shell 支持列表 for 循环使用略写的计数方式, 1~5 的范围用 {1..5} 表示 (大括号不能去掉, 否则会当作一个字符串处理). 其中数字也可以使用 $(seq) 来表示.
(2)Sheel 中还支持按规定的步数进行跳跃的方式实现列表 for 循环, 例如计算 1~100 内所有的奇数之和.
- #!/bin/bash
- sum=0
- for i in {1..100..2};do
- let sum+=i
- done
- echo "sum=$sum"
通过 i 按 2 不断递增, 得到 1-100 的奇数之和. 同样我们也可以使用 seq 来表示: for i in $(seq 1 2 100),seq 表示起始数为 1, 跳跃的步数为 2, 到 100 结束.
(3)for 也可以和其他的选择语句进行搭配使用, 例如: 创建一个脚本名为 useradd.sh, 当执行 - a 选项时, 会批量创建用户 mageuser1~mageuser20, 要求 mageuserX 的 uid 为 200x,mageuserxx 的 uid 为 20xx,1~8 用户的 shell 为 / sbin/nologin,9~20 用户的 uid 为 / bin/bash. 最后这 20 个用户的密码都设置为 centos; 当执行 - d 选项时, 批量删除用户 mageuser1~mageuser20. 连同家目录一同删除.
- #!/bin/bash
- case $1 in
- -a)for n in {1..20} ;do
- if [ $n -le 8 ];then
- useradd -u $[2000+$n] -s /sbin/nologin mageuser$n
- else
- useradd -u $(echo "2000+$n"|bc) mageuser$n
- fi
- echo "centos" |passwd --stdin mageuser$n &> /dev/null
- echo "mageuser$n created"
- done;;
- -d)for n in {1..20} ;do
- userdel -r mageuser$n
- done;;
- *)echo "Please type -a or -d";;
- esac
case 是一种条件判断语句, 这里分为 - a 和 - d, 使用 case 最好(注意每次 case 分支结束后, 后面有两个;).echo "centos" |passwd --stdin mageuser$n &> /dev/null 是批量修改密码, 把它丢到 / dev/null 中, 并不执行.
2. while 循环
while CONDITION;do
循环体
done
CONDITION: 循环控制条件; 进入循环之前, 先做以此判断, 每次循环之后会再做一次判断; 循环为 "true", 则执行一次循环; 直到循环为 "flase" 终止循环.
CONDITION 一般应该有循环控制变量; 因此变量的值会在循环体不断地被改正.
进入循环之前 while 重复次数是利用一个条件来控制是否继续重复执行这个语句. 为了避免死循环, 必须保证循环体中包含循环出口条件
(1)基本的 while 循环, 例如: 打印从 1 到 10
- #!/bin/bash
- n=0
- while [ $n -lt 10 ];do
- echo $n
- let n++
- done
首先定义一个变量 n, 判断 n 的值和 10 的大小关系, 只要 n 的值为真, 循环就会一直进行. let n++ 是让 n 的值每次加 1.
(2)循环控制语句 continue
continue 用于循环体中
continue [n]: 提前结束第 n 层本轮的循环, 直接进入下一层循环; 最内层为第一层(1 也可以省去).
1)continue 基础应用
- #!/bin/bash
- n=0
- while [ $n -lt 10 ];do
- echo $n
- let n++
- if [ $n -eq 5 ];then
- continue
- fi
- done
continue 终止了这次循环, 并继续下一个循环, 所以打印结果依然是 0-10.
(3)循环控制语句 break
break 用于跳出循环, 可以跳出任何类型的循环
1)break 跳出单层循环
- #!/bin/bash
- a=1
- while [ $a -le 5 ];do
- if [ $a -eq 3 ];then
- break
- fi
- echo "a=$a"
- a=$[$a+1]
- done
本脚本 a 从 1 开始取值, a<5 时, 一直进行循环, 当 a=3 时, break 终止循环, 所以打印出来 a 的值为 1 和 2.
2)break 跳出多层循环
break n,n 表示要跳出的循环层数, 默认情况下 n=1, 代表只跳出当前循环.
- #!/bin/bash
- a=1
- while [ $a -le 5 ];do
- echo "a=$a"
- a=$[$a+1]
- for n in 1 2 3 4 5;do
- if [ $n -eq 3 ];then
- break 2
- fi
- echo "n=$n"
- n=$[$n+1]
- done
- done
脚本中进行 for 循环, n=3 时终止循环, 但不会妨碍 while 进行的循环, 所以之跳出 for 循环, 打印出 n=1,n=2.
3.until 循环
until CONDITION;do
循环体
done
进入条件: CONDITION 为 false
退出条件: CONDITION 为 true
until 命令和 while 命令类似, 但与 while 刚好相反, 即 whie 循环在条件为真时继续执行循环而 until 则在条件为假时执行循环.
- #!/bin/bash
- until [ $n -eq 10 ];do
- echo $n
- let n++
- done
n 的初始值为 0, 每次循环加 1, 因为条件为假时执行循环, 会一直打印从 0 到 0, 当 n=10 时, 条件为真, 终止循环. 所以打印结果为 0-9.
来源: http://www.bubuko.com/infodetail-2732246.html