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

相关内容