循环中的 condition 与 if 中的 condition 概念(取扩展、test命令、普通命令的退出码,还可以逻辑运算执行)是一样的。
while 循环
condition 为 true 时执行。
语法:
# 第一种
while true; do
commands
done
# 第二种
while true
do
commands
done
until 循环
condition 为 false 时执行。与 while 正好相反,当 condition 为 true 时停止执行。
语法:
# 第一种
until false; do
commands
done
# 第二种
until false
do
commands
done
for...in 循环
遍历列表的每一项。
语法:
# 第一种
for variable in list; do
commands
done
# 第二种
for variable in list
do
commands
done
那么数据源可以是哪些呢?
1、可以直接读取in后面的值,默认以空白符作为分隔
Shell script
#!/bin/bash
for v in a b c; do
echo ${v}
done;
输出:
a
b
c
2、读取变量中的值
#!/bin/bash
words="Word1 Word2 Word3"
for word in ${words}; do
echo "${word}"
done
输出:
Word1
Word2
Word3
3、通过命令读取文件中的 Word
content.txt
abc
123
a b c
Shell script
#!/bin/bash
count=0
for i in $(cat ./content.txt); do
count=$((count + 1))
echo "Word $count ($i) contains $(echo -n $i | wc -c) characters"
done
输出:
Word 1 (abc) contains 3 characters
Word 2 (123) contains 3 characters
Word 3 (a) contains 1 characters
Word 4 (b) contains 1 characters
Word 5 (c) contains 1 characters
for 循环
语法:
# 第一种
for (( expression1; expression2; expression3 )); do
commands
done
# 第二种
for (( expression1; expression2; expression3 ))
do
commands
done
# 死循环
for ((;;)); do
commands
done
for ((;;))
do
commands
done
expression1
用来初始化循环条件,expression2
用来决定循环结束的条件,expression3
在每次循环迭代的末尾执行,用于更新值。
for 循环栗子:
#!/bin/bash
for ((i = 0; i < 5; i++))
do
echo "${i}"
done
输出:
0
1
2
3
4
死循环栗子:
for ((;;))
do
read var
if [ "${var}" = "." ]; then
break
fi
echo "Input: ${var}"
done
break,continue
break:立即终止循环,退出循环
栗子:
#!/bin/bash
for number in 1 2 3 4 5 6
do
echo "number is $number"
if [ "$number" = "3" ]; then
break
fi
done
continue:终止本次循环,开始下一次循环
栗子:
#!/bin/bash
while read -p "What file do you want to test?" filename
do
if [ ! -e "$filename" ]; then
echo "The file does not exist."
continue
fi
echo "You entered a valid file.."
done
select 结构
- 根据提供的 list 去生成一个提供给用户选择的菜单,list 的项与菜单项一一对应。
- 生成的菜单项的编号是从1开始递增的。
- 当用户输入编号后,执行 do 中的处理。
- 用户选择的项的编号可以通过
${REPLY}
环境变量获取。 - 若用户直接回车,Bash 会重新输出菜单让用户选择。
- do 中的处理执行完毕后,重复这个过程。
- 可以在 select 结构中使用 break & continue
语法:
select name in [list]
do
commands
done
栗子:
#!/bin/bash
select selected in Huawei, iPhone, Xiaomi
do
echo "You've chosen ${REPLY}: ${selected}"
done
结合 case 使用:
#!/bin/bash
echo "Which Operating System do you like?"
select os in Ubuntu LinuxMint Windows8 Windows10 WindowsXP
do
case $os in
"Ubuntu"|"LinuxMint")
echo "I also use $os."
;;
"Windows8" | "Windows10" | "WindowsXP")
echo "Why don't you try Linux?"
;;
*)
echo "Invalid entry."
break
;;
esac
done