Linuxシェルスクリプト:ifステートメントの入力文字を計算しますが、予想したものとは異なります。

Linuxシェルスクリプト:ifステートメントの入力文字を計算しますが、予想したものとは異なります。

いくつかの要素を含む配列があり、一部の関数には次のものがあります。

echo -n "Select the option: "
read option

echo "option: '${option}'"
echo "option: '$option'"

if [[ $option -ge 1 && option -le ${#array[@]} ]]; then
 echo "go go go"
 ...
else
 ...
fi

入力に関して記録された数字が配列の長さ/サイズより大きい場合、ブロックは期待どおりにelse実行されます(負の数と同じ)0。ここまではすべてが予想される

しかし、ように単純な文字を書くとsブロックが実行されます。difいいえ期待される。

select the option: d
option: 'd'
option: 'd'
go go go

私の理解によると、数字に適用さ-geれます-le。したがって、文字を使用して数値比較を実行する場合は失敗する必要があります。elseブロックに直接移動する必要があります。

この問題をどのように解決しますか?

答え1

ここで何が起こっているのかは(あなたに)予期しないコメントです。ちなみに、元の表現は次のようになります。

[[ $option -ge 1 && option -le ${#array[@]} ]]

まず$option在庫を確保してください。この場合ですd。その後、それを式[[ … ]]にリンクして次のようにします。

[[ d -ge 1 && option -le 12 ]]

これは評価的です。ただし、[[ … ]]使用された式は変数名で評価および処理さbashれるため、別のレベルの拡張があります(暗黙的にthisを認識する)。doptiond=0

[[ 0 -gt 1 && d -le 12 ]]

最初の部分が失敗するので、2番目の(間違った)式をスキップします。

考えられるいくつかの解決策があります。

  1. [[ … ]]古いが許可されているものを使用する代わりに[ … ]。これは二重拡張を行いません。ただし、これは数字以外の場合は「数字ではない」エラーをキャッチしないため、$optionエラーが発生します。

    [ "$option" -ge 1 ] && [ "$option" -le ${#array[@]} ]
    
  2. 文字列の文字が数値であることを確認して、式の比較を保護します。

    [[ "$option" =~ ^(0|([1-9][0-9]*))$ && "$option" -ge 1 && "$option" -le "${#array[@]}" ]]
    

関連情報