/bin/shで複数のvar値を使用してtest -eq式を縮小する方法

/bin/shで複数のvar値を使用してtest -eq式を縮小する方法
#!/bin/sh
if [ $num -eq 9 -o $num -eq 75 -o $num -eq 200 ]; then
    echo "do this"
elif [ $num -eq 40 -o $num -eq 53 -o $num -eq 63]; then
    echo "do something for this"
else
    echo "for other do this"
fi

お問い合わせの表現を絞り込む他の方法はありますかif?たぶん良い

[ $num -eq (9,75,200) ]

しかし、このOSにはGNUユーティリティはありません。

答え1

時々、他の構造がより読みやすくなることがあります。

case $num in
9|75|200) echo "do this" ;;
40|53|63) echo "do something for this" ;;
*)        echo "for other do this" ;;
esac

答え2

注意してください。 posixは4つ以上のパラメータでテストを定義しないため、テスト構造は次のとおりです。はっきりしない。より第六大ヒットトラップ

したがって、テストを使用する場合は、さらに詳しく説明する必要があります。

if [ "$arg" = 9 ] || [ "$arg" = 75 ] || [ "$arg" = 200 ]

または代わりにユースケース

case "$arg" in
     9|75|200)  do something ; ;
     40|53|63)  do that ;;
      *)  else ... ;;
 esac

答え3

これは機能の操作のように聞こえます。

test_num() {
  n=$1; shift
  for arg do
    [ "$arg" -eq "$n" ] && return 0
  done
} 2>/dev/null

if test_num "$num" 9 75 200; then
  echo "do this"
elif test_num "$num" 40 53 63; then
  echo "do something for this"
else
  echo "for other do this"
fi

答え4

別のPOSIXソリューション:

if     printf '%s' "$num" | grep -xE '(9|75|200)' >/dev/null; then
       echo "do this"
elif   printf '%s' "$num" | grep -xE '(40|53|63)' >/dev/null; then
       echo "do something for this"
else
       echo "for other do this" 
fi

このオプションは非常に遅いです。caseこのオプションより50倍遅いです。


これは短いスクリプトですが、ケースオプションだけが2倍長くかかるより簡単なスクリプトだと思います。

#!/bin/sh

num="$1"    a='9 75 200'    b='40 53 63'

tnum() {
    for    arg
    do     [ "$arg" = "$num" ] && return 0
    done   return 1
}

if     tnum $a; then
            echo "do this"
elif   tnum $b; then
            echo "do something for this"
else
            echo "for other do this"
fi

注:[ "$arg" = "$num" ]すべての状況で有効なテストはありません。00 = 0たとえば、このテストは失敗します。
そして数値テストは[ "$arg" -eq "$num" ]null値と一致しません[ "" -eq "" ]

状況に最適な方法を選択できます。

関連情報