-eq 运算符未按预期工作

-eq 运算符未按预期工作

我有以下程序

read CHAR
if [[ ($CHAR -eq Y) || ($CHAR -eq y) ]]
then
  echo "YES"
elif [[ ($CHAR -eq N) || ($CHAR -eq n) ]]
then
  echo "NO"
fi

它没有按预期工作,即使我将 N 传递给 CHAR,它仍然打印 YES。

当我用 = 替换 -eq 时,它按预期工作。

read CHAR
if [[ ($CHAR = Y) || ($CHAR = y) ]]
then
  echo "YES"
elif [[ ($CHAR = N) || ($CHAR = n) ]]
then
  echo "NO"
fi

我可以知道为什么这里的 -eq 没有​​按预期工作吗?

答案1

-eq构造用于比较整数和不是字符串。您需要相等检查运算符===with[[..]]或 using =with[..]

保证[..]符合 POSIX 标准并且应该在任何 shell 上工作,而[[..]]是一个bash/zsh特定的构造,它为[.(..)周围的检查也是不是根本需要。

所以纯粹的 POSIX 就这样做

read char
if [ "$char" = "Y" ] || [ "$char" = "y" ]; then
    printf 'matches Yes \n'
fi

另一种 POSIX 变体是使用case语句作为

read char
case "$char" in
    [Yy]) echo "Yes" ;;
    [Nn]) echo "No"  ;;
    *) echo "incorrect" ;;
esac

答案2

-eq是一个数字比较运算符。对字符串使用====与)。[[ ...]]

您可以在文档中找到更多详细信息man bash

另一个可能有用的工具是https://shellcheck.net

相关内容