AND 或 OR 的一些基础知识我需要一些帮助

AND 或 OR 的一些基础知识我需要一些帮助

我有一些问题似乎被难住了。这似乎符合 Bash 的逻辑。

if [ "$argument" = "Y" -o "$argument" = "YES" ];
  then
fi

有没有办法创建这个语句而不使用"$argument"两次?我如何扩展它以添加 3 或 4 个答案,例如是的,好的

第二,

while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] || [ "$argument" != "N" ] || [ "$argument" != "NO" ]; do
   echo "Not a valid selection"
done

我不确定我在这里做错了什么,但无论输入的语句如何$argument,我总是得到Not a valid selection它不会接受 Y、YES、N 或 NO

答案1

在您的示例中,它总是说答案无效,这是因为您编写的逻辑没有有效的真实案例。不管它的价值$argument是多少,它都会总是不等于YYES,就好像它是这些值之一一样,它不能成为另一个。

您可能想查看以下case声明:

valid=0
while [[ valid -eq 0 ]]; do
    read -p 'Really? > ' argument
    case "$argument" in
        Y*|y*)
            valid=1
            : handle 'yes' cases
            ;;
        N*|n*)
            valid=1
            : handle 'no' cases
            ;;
        *)
            printf 'Invalid input "%s".  Please say "yes" or "no".\n' "$argument" 1>&2
            ;;
    esac
done

答案2

if [ "$argument" = "Y" -o "$argument" = "YES" ]; then

有没有办法在不使用“$argument”两次的情况下创建此语句?

在标准外壳中,具有case

case $argument in
    Y|YES) echo "it's 'Y' or 'YES'";;
    *) echo "it's something else";;
esac

在 Bash/Ksh/Zsh 中,使用正则表达式:

if [[ $argument =~ Y|YES ]]; then
    ...

在 Bash/Ksh(或带有 的 Zsh setopt kshglob)中,使用 Ksh 风格的扩展 glob:

if [[ $argument = @(Y|YES) ]]; then
    ...

当然,还有各种其他选项,例如 regex ^Y(ES)?$,或者^[yY]匹配以yor开头的任何内容Y(包括yuck, no!)。


while [ "$argument" != "Y" ] || [ "$argument" != "YES" ] ... 

我不确定我在这里做错了什么

在这种情况下,手动完成逻辑会有所帮助。假设argumentY,那么[ "$argument" != "Y" ]是假的,[ "$argument" != "YES" ]是真值,所以结果是或者是真的。对其他值重复此操作,您将看到至少其中一个比较始终为真。

相关内容