41. case 新终止符 ;& 和 ;;&


正如我们所知,;; 用作 case 语句的模式块中的最后一个语句,并且 bash 在遇到;; 后不会尝试测试任何进一步的模式匹配。 (即执行;; 后终止 case 语句)。

您还可以使用;&;;& 代替双分号 (;; )。 下表解释了三种大小写终止符。

Terminator Description
;; 执行当前模式块中的语句后,bash 终止 case 语句并退出。
;& 执行完当前模式块中的语句后,bash 继续跳转到下一个模式块中的语句并执行它们(不测试下一个模式块中的模式条件),然后根据下一个模式块的终止符来决定是否继续执行。
;;& 执行当前模式块中的语句后,bash 继续执行下一个模式块并测试其余的模式条件; 如果模式匹配,bash 就会执行关联模式块中的语句。

下面的例子中,其他情况都被跳过; 仅执行 CA 案例

$ cat case3.sh
stateabbr=${1}
case $stateabbr in
  NY )
    echo "NY is New York"
    ;;
  CA )
    echo "CA is California"
 ;;
  NV )
    echo "NV is Nevada"
    ;;
  *  )
    echo "Unknown State Name"
    ;;
esac

$ ./case3.sh CA
CA is California

在下面的示例中,由于;&用于终止 CA 模式块,因此也会打印 NV。 但是由于 ;;用于终止 NV 块,跳过 NV 之后的其余情况。

$ cat case4.sh
stateabbr=${1}
case $stateabbr in
  NY )
    echo "NY is New York"
    ;&
  CA )
    echo "CA is California"
    ;&
  NV )
    echo "NV is Nevada"
    ;;
  *  )
    echo "Unknown State Name"
    ;;
esac

$ ./case4.sh CA
CA is California
NV is Nevada

在下面的示例中,由于;;&用于终止 CA 模式块,因此测试了 NV 情况,但失败。 因此,对 * 情况进行了测试,并且由于它总是成功,因此会打印 "Unknown State Name"

$ cat case5.sh
stateabbr=${1}
case $stateabbr in
  NY )
    echo "NY is New York"
    ;;&
  CA )
    echo "CA is California"
    ;;&
  NV )
    echo "NV is Nevada"
    ;;
  *  )
    echo "Unknown State Name"
    ;;
esac

$ ./case5.sh CA
CA is California
Unknown State Name