
次のプログラムがあります
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[[..]]
またはwithの使用が必要です=
。[..]
POSIX仕様を保証[..]
し、すべてのシェルで動作する必要があります[[..]]
が、周囲の検査を実行するbash
/zsh
特定の構成は[
。(..)
いいえ基本的に必要です。
純粋なPOSIXはこれを行います。
read char
if [ "$char" = "Y" ] || [ "$char" = "y" ]; then
printf 'matches Yes \n'
fi
case
もう1つのPOSIXバリアントは、ステートメントを次のように使用することです。
read char
case "$char" in
[Yy]) echo "Yes" ;;
[Nn]) echo "No" ;;
*) echo "incorrect" ;;
esac
答え2
-eq
数値比較演算子です。文字列には=
(=
またはAND)を使用してください。==
[[ ...]]
詳細はマニュアルで確認できますman bash
。
便利なもう1つのツールは次のとおりです。https://shellcheck.net