LoginSignup
7
4

More than 3 years have passed since last update.

bashでシングルコーテーションをネストさせる

Last updated at Posted at 2019-11-29

経緯

シェルスクリプトを作成する際にどうしてもシングルコーテーションをネストさせる必要がありましたが、ちょっぴり悩んだのでいろいろと試しました(だいたい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!
#おまけ

シェル芸の片鱗を感じる

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4