Shell脚本入门教程-循环篇

494 阅读1分钟

目录

  1. 基础命令
  2. 变量
  3. 创建并运行脚本
  4. 条件
  5. 循环
  6. 函数
  7. 其他(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依次等于word1word2word3,命令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 提供了两个内部命令breakcontinue,用来在循环内部跳出循环。

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