while 語句中的 Bash 或條件

while 語句中的 Bash 或條件

我想在 bash 中編寫一個腳本,它檢查用戶輸入是否等於“stringA”或“stringB”,如果它等於這些字串之一,它應該會列印使用者輸入。我的程式碼是:

#!/bin/bash

echo "Please enter your choice (stringA or stringB): "
read result

while [[ (${result,,} != 'stringa') || (${result,,} != 'stringb') ]]; do
        echo Please enter only stringA or stringB:
        read result
done

echo "You have selected $result!"

exit

不幸的是,這段程式碼不起作用且無限循環。我只能比較 是否等於刪除while 循環的第二部分的$result字串之一。||我嘗試將其替換||-o,但出現以下錯誤:

./chk.sh: line 12: syntax error in conditional expression
./chk.sh: line 12: syntax error near `-o'
./chk.sh: line 12: `while [[ (${result,,} != 'stringa') -o (${result,,} != 'stringb') ]]; do' 

答案1

那是因為你想使用&&,而不是||

如果結果不是 stringA 且不是 stringB,則需要重複循環。沒有字串可以等於它們兩者,這會結束循環。

您也可以在以下位置使用模式[[ ... ]]

while [[ ${result,,} != string[ab] ]]

答案2

#!/bin/bash

echo "Please enter your choice (stringA or stringB): "
read result

while ! [ "${result,,}" = 'stringa' -o "${result,,}" = 'stringb' ]; do
        echo Please enter only stringA or stringB:
        read result
done

echo "You have selected $result!"

exit

在文字語音中,雖然結果不是 stringa 或結果是 stringb,但...

請注意"您的變量,否則如果 var$result為空,您將收到錯誤訊息。

答案3

您的程式碼中的問題是您的循環 while$result兩個都 stringAstringB(同時)。您可能會想使用

while [[ "${result,,}" != 'stringa' ]] && [[ "${result,,}" != 'stringb') ]]

或者

until [[ "${result,,}" == 'stringa' ]] || [[ "${result,,}" == 'stringb') ]]

要讓使用者選擇幾個選項之一,不要讓他們輸入長字串。相反,為他們提供一個簡單的菜單供他們選擇。

建議:

#!/bin/bash

PS3='Your choice: '
select result in 'stringA' 'stringB'; do
    case $REPLY in
        [12])
            break
            ;;
        *)
            echo 'Invalid choice' >&2
    esac
done

printf 'You picked %s!\n' "$result"

運行這個:

$ bash script.sh
1) stringA
2) stringB
Your choice: 3
Invalid choice
Your choice: 2
You picked stringB!

答案4

一個變體,可以消除與使用區域設定轉換字串sh相關的問題(例如,小寫字母並不適合所有人):${var,,}Ii

#! /bin/sh -
while true; do
  printf %s "Please enter your choice (stringA or stringB): "
  IFS= read -r result || exit # exit on EOF
  case $result in
    ([sS][tT][rR][iI][nN][gG][aAbB]) break
  esac
  echo >&2 Invalid choice.
done

相關內容