目录
- 基础命令
- 变量
- 创建并运行脚本
- 条件
- 循环
- 函数
- 其他(read、mktemp、trap)
循环结构
While 循环结构
while循环有一个判断条件,只要符合条件,就不断循环执行指定的语句。
while condition; do
commands
done
上面代码中,只要满足条件condition,就会执行命令commands。然后,再次判断是否满足条件condition,只要满足,就会一直执行下去。只有不满足条件,才会退出循环。
循环条件condition可以使用test命令,跟if结构的判断条件写法一致。
#!/bin/bash
number=0
while [ "$number" -lt 10 ]; do
echo "Number = $number"
number=$((number + 1))
done
上面例子中,只要变量$number小于10,就会不断加1,直到$number等于10,然后退出循环。
关键字do可以跟while不在同一行,这时两者之间不需要使用分号分隔。
while true
do
echo 'Hi, while looping ...';
done
上面的例子会无限循环,可以按下 Ctrl + c 停止。
for...in 循环结构
for...in循环用于遍历列表的每一项。
for variable in list
do
commands
done
上面语法中,for循环会依次从list列表中取出一项,作为变量variable,然后在循环体中进行处理。
关键词do可以跟for写在同一行,两者使用分号分隔。
for variable in list; do
commands
done
下面是一个例子。
#!/bin/bash
for i in word1 word2 word3; do
echo $i
done
上面例子中,word1 word2 word3是一个包含三个单词的列表,变量i依次等于word1、word2、word3,命令echo $i则会相应地执行三次。
列表也可以通过子命令产生。
#!/bin/bash
count=0
for i in $(cat ~/.bash_profile); do
count=$((count + 1))
echo "Word ${count} (${i}) contains $(echo -n ${i} | wc -c) characters"
done
上面例子中,cat ~/.bash_profile命令会输出~/.bash_profile文件的内容,然后通过遍历每一个词,计算该文件一共包含多少个词,以及每个词有多少个字符。
如果使用
"$(cat ~/.bash_profile)",则该循环只执行一遍,被引号括起来的内容是一个整体。#!/bin/bash for i in "word1 word2 word3"; do echo $i done如果使用
$(cat ~/.bash_profile),则文件.bash_profile中有多少个单词,就会有多少次循环。#!/bin/bash for i in "word1" "word2" "word3"; do echo $i done
for 循环结构
for循环还支持 C 语言的循环语法。
for (( expression1; expression2; expression3 )); do
commands
done
上面代码中,expression1用来初始化循环条件,expression2用来决定循环结束的条件,expression3在每次循环迭代的末尾执行,用于更新值。
注意,循环条件放在双重圆括号之中。另外,圆括号之中使用变量,不必加上美元符号
$。
for (( i=0; i<5; i=i+1 )); do
echo $i
done
break,continue
Bash 提供了两个内部命令break和continue,用来在循环内部跳出循环。
break命令立即终止循环,程序继续执行循环块之后的语句,即不再执行剩下的循环。
#!/bin/bash
# 当数字等于3时,立即跳出所有循环
for number in 1 2 3 4 5 6
do
if [ "$number" = "3" ]; then
break
fi
echo "number is $number"
done
# 当数字等于3时,跳过并进入下一次循环
for number in 1 2 3 4 5 6
do
if [ "$number" = "3" ]; then
continue
fi
echo "number is $number"
done