bash についての質問です。ある値が、1,2,3,9 の中のどれかだったら、true を返すという条件の判定は簡単にできるのでしょうか? SQL でいうところ IN のような条件判定です。あったような気がするのですが、すぐには見つかりませんでした。

回答の条件
  • URL必須
  • 1人3回まで
  • 13歳以上
  • 登録:2012/03/30 16:42:52
  • 終了:2012/04/05 14:50:56

ベストアンサー

id:mjy No.3

mjy回答回数67ベストアンサー獲得回数202012/03/30 19:15:49

ポイント33pt
# bash であれば [[ コマンドの == 演算子でパターンマッチングが使えます。
[[ $x == [1239] ]]

if [[ $x == [1239] ]]; then
    echo True
else
    echo False
fi

#詳しくは、Man Pageの複合コマンド(Compound Commands)の [[ の箇所や、
help [[
#の出力などを参考にして下さい。
#新しいbashならば、 =~ 演算子で正規表現も使えます。

http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html

マッチング候補が、空文字や2文字以上になる場合の例を追加しておきます。

#最近のbashなら =~ 演算子で正規表現を使用可。
[[ $x =~ ^(abc|123|XYZ|'')$ ]]

#あるいは、拡張パターンマッチングを使う。
#Man Pageのextglobの説明を参照
shopt -s extglob
[[ $x == @(abc|123|XYZ|'') ]]
他2件のコメントを見る
id:y-kawaz

最近のbashは =~ で正規表現が使えるってのはmjyさんの回答で初めて知りました。

[[ "$x" =~ '^(1|2|3|9)$' ]] && echo OK || echo NG

こんなふうに使えるんですね。参考になります。

2012/03/31 18:10:31
id:y-kawaz

おぉ、extglob することでそんな書き方も出きるんですね。

2012/03/31 18:36:38

その他の回答(2件)

id:y-kawaz No.1

y-kawaz回答回数1421ベストアンサー獲得回数2262012/03/30 17:17:01

ポイント34pt

やり用はいくらでもあると思いますが…、ぱっとよく使いそうなパターンを挙げておきます。

X=1

# if文で
if [ "$X" == 1 -o "$X" == 2 -o "$X" == 3 -o "$X" == 9 ]; then
  echo OK
else
  echo NG
fi

# case文で
case "$X" in
  1|2|3|9)
    echo OK
    ;;
  *)
    echo NG
    ;;
esac

# testでワンライナー
test "$X" == 1 -o "$X" == 2 -o "$X" == 3 -o "$X" == 9 && echo $OK || echo NG

# case文のワンライナー
(case "$X" in 1|2|3|9);;*)exit 1;;esac) && echo OK || echo NG

# egrepで
echo "$X" | egrep -q '^(1|2|3|9)$' && echo OK || echo NG

http://q.hatena.ne.jp/answer

id:kaiketsu

IN的なのはないのですね。タイプがすくないのは、case 文みたいですね。

2012/03/30 17:51:37
id:y-kawaz No.2

y-kawaz回答回数1421ベストアンサー獲得回数2262012/03/30 18:37:30

ポイント33pt

INのような処理をよく使うなら以下のような関数を作っておくとスマートかも。

# 第1引数が第2引数以降に含まれたら0、含まれなかったら1を返す
function test_in() {
  actual="$1"; shift
  for expected in "$@"; do
    test "$actual" == "$expected" && return 0
  done
  return 1
}

# テスト
test_in 1 1 2 3 9 && echo OK || echo NG

http://q.hatena.ne.jp/answer

id:mjy No.3

mjy回答回数67ベストアンサー獲得回数202012/03/30 19:15:49ここでベストアンサー

ポイント33pt
# bash であれば [[ コマンドの == 演算子でパターンマッチングが使えます。
[[ $x == [1239] ]]

if [[ $x == [1239] ]]; then
    echo True
else
    echo False
fi

#詳しくは、Man Pageの複合コマンド(Compound Commands)の [[ の箇所や、
help [[
#の出力などを参考にして下さい。
#新しいbashならば、 =~ 演算子で正規表現も使えます。

http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html

マッチング候補が、空文字や2文字以上になる場合の例を追加しておきます。

#最近のbashなら =~ 演算子で正規表現を使用可。
[[ $x =~ ^(abc|123|XYZ|'')$ ]]

#あるいは、拡張パターンマッチングを使う。
#Man Pageのextglobの説明を参照
shopt -s extglob
[[ $x == @(abc|123|XYZ|'') ]]
他2件のコメントを見る
id:y-kawaz

最近のbashは =~ で正規表現が使えるってのはmjyさんの回答で初めて知りました。

[[ "$x" =~ '^(1|2|3|9)$' ]] && echo OK || echo NG

こんなふうに使えるんですね。参考になります。

2012/03/31 18:10:31
id:y-kawaz

おぉ、extglob することでそんな書き方も出きるんですね。

2012/03/31 18:36:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません