我有以下程序
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