Skip to content

Instantly share code, notes, and snippets.

@mmktomato
Last active June 24, 2021 10:51
Show Gist options
  • Save mmktomato/765980ab00da8c9c432dbbbe9d2a73c3 to your computer and use it in GitHub Desktop.
Save mmktomato/765980ab00da8c9c432dbbbe9d2a73c3 to your computer and use it in GitHub Desktop.
[/bin/sh でも使える] 改行や空白を含む文字列の中に特定の文字列が含まれるかどうか調べる

[/bin/sh でも使える] 改行や空白を含む文字列の中に特定の文字列が含まれるかどうか調べる

注: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 が含まれているかどうか?を知りたい

/bin/sh の場合

ハマったパターン

$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!!!

/bin/bash の場合

bash ならもっと簡単に書けます。直感的でいいですね。

#!/bin/bash
$ if [[ $STR == *HOGE* ]]; then echo 'FOUND!!!'; fi
FOUND!!!

まとめ

bash を使える状況なら bash を使いましょう。コマンドに引数を渡すときは空白と改行に気をつけましょう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment