1 for循环
- 语法
for 变量名 in 取值列表
do
命令序列
done
- for语句的执行流程
首先将列表中的第一个取值赋给变量,并执行 do…done循环体中的命令序列
然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列……
Ø依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
- 示例
# 范围遍历数列
for i in {1..10}
do
if [ $( expr $i % 2 ) -eq 0 ]
then
echo $i
fi
done
# 遍历具体的数列
for i in 1 3 9 8 4 2
do
echo $i
done
# 键盘输入
for i in $*
do
echo $i
done
# 不能识别位置变量
for i in {$1..$2}
do
echo $i
done
# 也不能识别自定义变量
num1=3
num2=9
for i in {$num1..$num2}
do
echo $i
done
# 使用变量的遍历方法
read -p "input num1: " num1
read -p "input num2: " num2
for ((i=$num1;i<=$num2;i++))
do
echo $i
done
# 遍历数组,直接遍历值
arr=(1 2 3 4 5 6 9)
for i in ${arr[*]}
do
echo $i
done
# 通过数组索引遍历值 ${!arr[*]}获取索引
arr=([1]=2 [3]=4 [5]=6 [7]=8 )
for i in ${!arr[*]}
do
echo "索引$i,对应的值${arr[$i]}"
done
# 通过数组长度遍历
arr=(1 3 5 7 9)
for ((i=0;i<${#arr[*]};i++))
do
echo ${arr[$i]}
done
# 倒序输出
for ((i=${#arr[*]}-1;i>=0;i--))
do
echo ${arr[$i]}
done
# 数组冒泡排序
arr=(3 5 1 9 7 6 2 8 4)
for ((i=0;i<${#arr[*]}-1;i++))
do
for ((j=0;j<${#arr[*]}-1;j++))
do
if [ ${arr[$j]} -gt ${arr[$j+1]} ]
then
t=${arr[$j]}
arr[$j]=${arr[$j+1]}
arr[$j+1]=$t
fi
done
done
for ((i=0;i<${#arr[*]};i++))
do
echo ${arr[$i]}
done
# 乘法口诀表
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
printf "%d*%d=%2d\t" $i $j $((i * j))
done
echo ""
done
# 批量测试主机
# 文件中存放需要测试的主机地址
ips=$(cat hosts.txt)
for ip in $ips
do
ping $ip -c 4 -i 0.2 &>/dev/null
if [ $? -eq 0 ]
then
echo "$ip is up" >> up.txt
else
echo "$ip is down" >> down.txt
fi
done
# 批量创建用户
for i in {1..3}
do
useradd -m -s /bin/bash user$i
done
# 批量删除用户
for i in {1..3}
do
userdel -r user$i
done
# 只拷贝文件
path=$(ls /test/test1)
for i in $path
do
if [ -f /test/test1/$i ]
then
cp /test/test1/$i /test/test2
echo "$i copy success"
fi
done
2 while循环
for 循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。
对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while 语句。
- 语法
while 条件测试语句
do
命令序列
done
- 示例
i=1
while [ $i -lt 10 ]
do
echo "$i"
let i++
done
# 创建用户
i=1
while [ $i -le 3 ]
do
username=user$i
# 判断用户是否存在
if id "$username" &>/dev/null
then
echo "用户 $username 已存在"
# 若用户不存在,则创建用户
else
useradd -m -s /bin/bash $username
# chpasswd:为用户设置密码
echo "$username:666" | chpasswd
fi
let i++
done
# 删除用户
i=1
while [ $i -le 3 ]
do
userdel -r user$i &>/dev/null
echo "用户 user$i 已删除"
let i++
done
3 intil循环
until循环在条件为假时执行循环
- 语法
until 条件测试语句
do
命令序列
done
- until 语句的执行流程
首先判断 until 后的条件测试操作结果,如果条件不成立,则执行 do…done 循环体中的命令序列。
返回 until 后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体。
如此循环,直到 until后的条件测试结果成立为止,最后跳转到 done 语句,表示结束循环。
- 示例
# 求和
i=1
sum=0
until [ $i -eq 10 ]
do
let sum=$sum+$i
let i++
done
echo $sum