経緯
シェルスクリプトを作成する際にどうしてもシングルコーテーションをネストさせる必要がありましたが、ちょっぴり悩んだのでいろいろと試しました(だいたいawkコマンドのせい)。
解答
bash
[root@server]# echo 'Hello, '\''NEW'\'' world!'
Hello, 'NEW' world!
解説
シングルコーテーションをネストすることは、bashの仕様上そもそもできません(タイトル詐欺では?)。
そこで、それっぽくするためにはネストさせる予定だったシングルコーテーションをシングルコーテーションの外に出し、外に出したシングルコーテーションをエスケープする必要があります。
上の例だと
'Hello, '
\' ←ネストさせたかったシングルコーテーション
'NEW'
\' ←ネストさせたかったシングルコーテーション
' world!'
を並べているだけです。
これができると下記のようなことができます。
bash
[root@server]# STATUS=OLD
[root@server]# echo 'Hello, '\''$STATUS'\'' world!'
Hello, '$STATUS' world!
#変数がシングルコーテーションで保護されている状態
[root@server]# eval echo 'Hello, '\''$STATUS'\'' world!'
Hello, $STATUS world!
#変数がシングルコーテーションで保護されているため二重展開では展開されない
[root@server]# eval eval echo 'Hello, '\''$STATUS'\'' world!'
Hello, OLD world!
#三重展開によってようやく変数が展開される
通常業務では使う機会ないと思いますが、変数でコマンドを生成する時によく使います。
やったこと
色々試して失敗したものを備忘として下記にメモ書き
bash
[root@server]# echo 'Hello, "NEW" world!'
Hello, "NEW" world!
#ダブコであればいたって簡単
bash
[root@server]# echo 'Hello, 'NEW' world!'
Hello, NEW world!
#同じように入れたんじゃもちろん表示されない
bash
[root@server]# echo 'Hello, \'NEW\' world!'
-bash: !': event not found
#シングルコーテーション内でエスケープすると正しく認識されない
bash
[root@server]# echo 'Hello, '''NEW''' world!'
Hello, NEW world!
#VBっぽく書いてもダメ
bash
[root@server]# echo 'Hello, '"'"'NEW'"'"' world!'
Hello, 'NEW' world!
#ダブコをうまいこと使えば一応できる
bash
[root@server]# eval echo "'"'Hello, '"'"\\\'"'"'NEW'"'"\\\'"'"' world!'"'"
Hello, 'NEW' world!
#おまけ
シェル芸の片鱗を感じる