2011年06月07日

bashで正規表現でif文で条件分岐で

でででので


プログラミングってfor文とif文が使えれば大体のことはできますよね



bashのif文についてここにメモ



bashのif文すごいメンドクサイんだね



一つでもスペース抜けてると構文エラー



if [ element1 比較演算子 element2 ];then
hoge
elif [ element3 比較演算子 element4 ];then
hogehoge
else
hogehogehoge
fi



条件式の行はスペースまで忠実に


比較演算子は

数値の場合

-eq ← =
-ne ← !=
-le ← <=
-ge ← >=
-lt ← <
-gt ← >

tex使ってるからこれはすぐ覚えれる


あと,AND条件とOR条件

-a ← and(&&)
-o ← or(||)

もメモっておく



文字列の場合

= ← =
!= ← !=

そのまんま


文字列の場合,正規表現を用いて比較を行いたいことが多い



でも上の比較演算子では正規表現は使えない



なのでif文内で正規表現を使う場合は以下


if [[ ${string1} =~ ${string2} ]]
then
hogehoge
fi



簡単な使用例

./photo/
onigiri01.jpg onigiri02.jpg onigiri03.jpg misosoup01.jpg misosoup02.jpg misosoup03.jpg


こんなディレクトリがあったとしてmisosoupの写真だけ消したい

そんな時は

for i in ./photo/*
do
if [[ ${i} =~ ./photo/misosoup* ]];then
rm ${i}
fi
done



ここでミソなのはミソスープだけに

./photo/misosoup*をクオーテーションで囲ったりしないこと


左側の${i}も囲わない


あと[[ ]] かぎかっこが二つ


という感じでした


参考
http://d.hatena.ne.jp/adsaria/20100107/1262842850 (adsaria moodさん)






この記事へのコメント

否定はどうやるのでしょうか
イメージ的にはこのような感じですが、
これではできませんでした

if[[ ${a} !~ ^...$ ]]

Posted by とおり at 2012年08月16日 11:30
--------------------------------------------------

if[[ ! ${a} =~ ^...$ ]]
で大丈夫ではないかと。

Posted by MasWag at 2012年11月30日 23:45
--------------------------------------------------

正規表現の*は前の文字の0回以上の繰り返し
./photo/misosoup*
だと
./photo/misosoup
または
./photo/misosou
にマッチすることと=~を使った場合は一部一致でも判定されるので偶然マッチしているように感じます。*は不要か数字部分が2ケタなのであれば..を使うとかでは?

Posted by at 2015年09月04日 09:59
--------------------------------------------------

そうか!
味噌スープに味噌以外の具材を入れていたのか!

Posted by at 2015年09月04日 10:00
--------------------------------------------------

name:

mail:

HP:

comment:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/207830185

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。