簡體   English   中英

Bash If語句,檢查字符串是否等於幾個字符串文字之一

[英]Bash If-statement to check If string is equal to one of several string literals

在我的bash腳本中,我使用以下if語句檢查第一個參數是-0還是+

LEVEL=$1
if [ "$LEVEL" -ne "-" ] && [ "$LEVEL" -ne "0" ] && [ "$LEVEL" -ne "+" ]
then
     echo "The value of LEVEL must be either -, 0, or +!"
     exit 1
fi

但這給了我錯誤[: -: integer expression expected ,指的是帶有if語句條件的行。

我一直在嘗試許多不同的語法(例如,雙括號與單括號,引用與不引用變量和字符串文字),但我無法弄清楚。

與POSIX sh兼容而不是利用bashisms的常規方法是使用case語句:

case $level in
   -|0|+)
     echo "Got it!" ;;
   *)
     echo "Not a valid value" ;;
esac

就是說,如果您想使用test ,也可以這樣做:

if [ "$LEVEL" != "-" ] && [ "$LEVEL" != "0" ] && [ "$LEVEL" != "+" ]; then
  ...
fi

!=是負數字符串比較運算符,而= (不是==是POSIX兼容的正匹配數。 (Bash在測試中將POSIX擴展為支持== ,但是養成使用此擴展的習慣會使您在以后嘗試為純POSIX shell編寫代碼時遇到麻煩)。


在這里下面,有bashisms! (以上是POSIX兼容的)。


在評論中,有人問了一個后續問題,即是否可以從變量中讀取可能的字符集。 通常,是的,盡管有一些警告:

# no spaces in possible_levels, as we're using it to form a pattern
possible_levels='-0+'
possible_levels_pattern="[${possible_levels}]"
if [[ $value = $possible_levels_pattern ]]; then
  echo "value contains a valid level"
fi

...作為一種更短的方法,允許您不修改輸入字符串就使用它,並且幾乎是正確的:

# caveat: will say some incorrect strings, like "- 0" or "0 +", are valid levels
possible_levels=' - 0 +'
check_level() {
  [[ " $possible_levels " = *" $1 "* ]] && echo "Value is a valid level"
}

...,或作為另一種實現方式(詳細,但在細節上正確):

possible_levels=' - 0 +'
read -a possible_levels_array <<<"$possible_levels"
check_level() {
  local possible_level
  local value=$1
  for possible_level in "${possible_levels_array[@]}"; do
    [[ $value = "$possible_level" ]] && return 0
  done
  return 1
}

if check_level "$value"; then
  echo "$value is a valid level"
else
  echo "$value is not a valid level"
fi

顯然,這是很多工作,總的來說,僅在適當的時候對比較進行硬編碼(並且可能會在不損失安全性的情況下),將使您避免嘗試使事情變得比實際需要的更為通用。

現在,如果我們可以將變量作為關聯數組傳遞,而無需支持愚蠢的以空格分隔的列表,則它會變得更短:

declare -A possible_levels=( [-]=1 [+]=1 [0]=1 )
if [[ ${possible_levels[$value]} ]]; then
  echo "valid level"
else
  echo "invalid level"
fi

您可以使用[[ and ]]使用選擇器:

if [[ "$LEVEL" == [0+-] ]]; then
  echo "got it"
fi

暫無
暫無

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

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