人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kaiketsu
●カテゴリ:コンピュータ 科学・統計資料
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● y-kawaz
●34ポイント

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

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


kaiketsuさんのコメント
IN的なのはないのですね。タイプがすくないのは、case 文みたいですね。

2 ● y-kawaz
●33ポイント

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


3 ● mjy
●33ポイント ベストアンサー
# 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|'') ]]

y-kawazさんのコメント
例がたまたま一桁だったけど、期待値の候補が空文字や二桁以上だと使えないですよね

mjyさんのコメント
このパターンだとそうですね。 y-kawazさんがegrepの例で使っている様なパターンを使えば可能です。 ここにはうまくコードが書けないので回答に追加しておきます。

y-kawazさんのコメント
最近のbashは =~ で正規表現が使えるってのはmjyさんの回答で初めて知りました。 >|sh| [[ "$x" =~ '^(1|2|3|9)$' ]] && echo OK || echo NG ||< こんなふうに使えるんですね。参考になります。

y-kawazさんのコメント
おぉ、extglob することでそんな書き方も出きるんですね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ