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