いくつかの要素を含む配列があり、一部の関数には次のものがあります。
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
ブロックが実行されます。d
if
いいえ期待される。
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を認識する)。d
option
d=0
[[ 0 -gt 1 && d -le 12 ]]
最初の部分が失敗するので、2番目の(間違った)式をスキップします。
考えられるいくつかの解決策があります。
[[ … ]]
古いが許可されているものを使用する代わりに[ … ]
。これは二重拡張を行いません。ただし、これは数字以外の場合は「数字ではない」エラーをキャッチしないため、$option
エラーが発生します。[ "$option" -ge 1 ] && [ "$option" -le ${#array[@]} ]
文字列の文字が数値であることを確認して、式の比較を保護します。
[[ "$option" =~ ^(0|([1-9][0-9]*))$ && "$option" -ge 1 && "$option" -le "${#array[@]}" ]]