シェルと改行とクォート


シェル(bash)で変数に入れた複数行の文字列をsed処理したのに、結果が一つしかない……となって困った。結論としては改行をそのまま取り出すにはダブルクォート"が必要だった。

値に改行を入れる

バッククォート\に続いて改行する場合、その改行はなかった事になる。

$ echo abc\
> def
abcdef

改行を実際の値に入れるには、シングルクォート'やダブルクォート"を使う。

$ echo 'abc
> def'
abc
def

$ echo "abc
> def"
abc
def

変数から取り出す

変数xに改行を含む文字列を代入する。

$ x="abc
> def"

これを取り出すときも、クォートによって挙動が異なる。つまり改行をそのまま取り出すにはまたダブルクォート"が必要になる。

$ echo $x
abc def

$ echo "$x"
abc
def

jsonなどの場合は問題にならないが、複数行を前提として処理していると初めに書いたようなことが起こるので注意が必要だった。(catとか多数のパラメータを受け取るコマンドにはクォートなしの挙動の方が都合がいいのだろう。)