注: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 を使いましょう。コマンドに引数を渡すときは空白と改行に気をつけましょう