Caseを使用してこの機能を実行しようとしています。
if [[ $input -gt 0 || $input -eq 0 ]];
場合に備えて、入力がゼロより大きいか、ゼロに等しいか、さらにゼロでゼロより小さいかをテストするためにケースを置くことはできますか?
答え1
このスクリプト例sh
は、変数が整数であることを確認します。
#!/bin/sh
num=$1
if [ $num -eq $num ] 2> /dev/null
then
case 1 in
$(($num < 0)) ) echo $num is negative.;;
$(($num <= 100)) ) echo $num is between 0 and 100.;;
$(($num <= 1000)) ) echo $num is between 100 and 1000.;;
* ) echo $num is greater than 1000.;;
esac
else
echo $num is not a number.
fi
変数が数値であることを確認するために演算子を使用します-eq
。stderr
数値でない場合は、出力を抑制する必要があります。
変数に整数が含まれている場合、case
レイアウトフォームの範囲が評価されます。式は$(( some comparison ))
true(1)またはfalse(0)として評価されるため、指定された範囲のリストをテストできます。
答え2
整数を正しく処理せずに整数のみを処理する必要がある場合は、-0
次のようになります。
case "$input" in
''|*[!0-9-]*|[0-9-]*-*)
echo "invalid input"
;;
[0-9]*)
echo "input >= 0"
;;
-[1-9]*)
echo "input < 0"
;;
*)
echo "invalid input"
;;
esac
if .. then .. elif ... then .. else .. fi
case
ただし、パターンマッチングを使用するよりも複雑な式がある場合を区別するために構文を使用する方が良い場合がよくあります。
答え3
[ "$input" -gt -1 ] || exit
...または...
case ${input:?NULL} in
(?*[!0-9]*|[!-0-9]*|[!0-9]) ! : ;;
(-*[!0]*) echo \<0 ;;
(*[!0]*) echo \>1 ;;
(0*) echo 0 ;;
esac
答え4
case $([[ $input =~ ^-?[0-9]+$ ]] && [[ $input -gt 0 || $input -eq 0 ]] ; echo $?) in
0)
echo "good"
;;
1)
echo "bad"
;;
*)
echo "weird"
;;
esac
ケース内部の複雑さが気に入らない場合、少なくとも正規表現のマッチングはうまく機能し、簡単です。