注:2018年に書いたものです。
シェルスクリプトにおいて、文字列 (str
) に文字列 (searchStr
) が含まれるかどうか調べる方法です。echo して grep すればいいかなと思ったんですが、 str
に改行や空白が含まれる場合にハマったのでメモしておきます。
ここからは以下の文字列 ($STR
) に HOGE
が含まれるかどうか、というシチュエーションを例にして説明します。
$ STR='HOGE HOGE\nFUGA FUGA\nPIYO PIYO'
$ echo -e $STR
HOGE HOGE
FUGA FUGA
PIYO PIYO
# $STR に HOGE が含まれているかどうか?を知りたい
$STR
を grep して HOGE
を探し、その結果を test コマンド ([
) に渡せばいいだろうという考えでまずはこうします。
#!/bin/sh
$ if [ `echo $STR | grep HOGE` ]; then echo FOUND!!!; fi
/bin/sh: 19: [: HOGE: unexpected operator
うまくいきませんでした。unexpected operator … ? (環境によっては「too many arguments」というエラーになる場合もあるようです。)
test コマンド ([
) で失敗しているようなので、 echo $STR | grep HOGE
を実行して結果を見てみます。どうやら結果に空白が入っているため上記のエラーになってしまっているようです。
$ echo $STR | grep HOGE
HOGE HOGE\nFUGA FUGA\nPIYO PIYO
そこで test に渡す結果をダブルクオーテーションで囲ってみます。今度は上手くいきました。
#!/bin/sh
$ if [ "`echo $STR | grep HOGE`" ]; then echo 'FOUND!!!'; fi
FOUND!!!
以下のように test を通さずに直接 if に渡しても目的は果たせますが、$STR
の内容が出力されてしまっています。
#!/bin/sh
$ if echo $STR | grep HOGE; then echo 'FOUND!!!'; fi
HOGE HOGE\nFUGA FUGA\nPIYO PIYO
FOUND!!!
bash ならもっと簡単に書けます。直感的でいいですね。
#!/bin/bash
$ if [[ $STR == *HOGE* ]]; then echo 'FOUND!!!'; fi
FOUND!!!
bash を使える状況なら bash を使いましょう。コマンドに引数を渡すときは空白と改行に気をつけましょう