簡體   English   中英

案例陳述失敗?

[英]Case statement fallthrough?

在流行的命令式語言中,一旦 case 語句匹配,switch 語句通常會“掉線”到下一層。

例子:

int a = 2;
switch(a)
{
   case 1:
      print "quick ";
   case 2: 
      print "brown ";
   case 3: 
      print "fox ";
      break;
   case 4:
      print "jumped ";
}

會打印“棕色狐狸”。

然而 bash 中的相同代碼

A=2
case $A in
2)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
4)
  echo "JUMPED"
  ;&
esac

只打印“BROWN”

如何使 bash 中的案例陳述像第一個示例一樣“落空”到其余條件?

(編輯:Bash 版本 3.2.25,;& 語句(來自維基)導致語法錯誤)

跑步:

測試.sh:

#!/bin/bash
A=2
case $A in
1)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
esac

給出:

./test.sh: 第 6 行:意外標記附近的語法錯誤;'./test.sh:
line 6:
;'./test.sh:
line 6:
;'./test.sh:
line 6:
;&'

;&;;&運算符是bash 4.0中引入的,因此,如果您要堅持使用5年的bash版本,則必須重復代碼,或者使用if

if (( a == 1)); then echo quick; fi
if (( a > 0 && a <= 2)); then echo brown; fi 
if (( a > 0 && a <= 3)); then echo fox; fi
if (( a == 4)); then echo jumped; fi

或尋找其他方法來達到實際目標。

(附帶說明, 請不要使用所有大寫的變量名 。您可能會覆蓋特殊的Shell變量或環境變量。)

嘗試這個:

case $VAR in
normal)
    echo "This doesn't do fallthrough"
    ;;
fallthrough)
    echo -n "This does "
    ;&
somethingelse)
    echo "fall-through"
    ;;
esac

使用一系列具有模式交替的 case 語句:

#!/bin/sh

a="2"
case "$a" in
    "1")
        echo "QUICK"
        ;;
esac
case "$a" in
    "1" | "2")
        echo "BROWN"
        ;;
esac
case "$a" in
    "1" | "2" | "3")
        echo "FOX"
        ;;
esac
case "$a" in
    "4")
        echo "JUMPED"
        ;;
esac

好處:

  • 遵循原始問題的格式
  • 適用於任何符合 POSIX 標准的 sh,包括舊版本的 Bash
  • 諸如“apple”、“pear”、“banana”、“tree”之類a無序字符串值將起作用
  • 控制流很簡單,沒有后向分支

缺點:

  • 需要更多字符,因為有四個 case 語句而不是一個

請注意,對於非環境變量,小寫a比大寫A更好,並且$a以及大小寫模式應該在a中可能有空格的一般情況下被引用。 對於簡單的情況,可以刪除引號。

解決方法:正則表達式

#! /bin/sh

case x in
  x|y) echo yay;;
  *) echo default;;
esac

使用;&並不是很可移植,因為它需要bash (不是ashdash或任何其他最小的sh ),並且至少需要bash 4.0或更高版本(並非在所有系統上都可用,例如macOS 10.14.6仍然僅提供bash 3.2) .57)。

我認為,一種解決方法比許多if的is循環好閱讀,並且修改case var更好:

#!/bin/sh

A=2
A_BAK=$A
while [ -n "$A" ]; do
    case $A in
        1)
            echo "QUICK"
            A=2
            ;;

        2)
            echo "BROWN"
            A=3
            ;;

        3)
            echo "FOX"
            A=4
            ;;

        4)
            echo "JUMPED"
            A=""
            ;;
    esac
done
A=$A_BAK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM