Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

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

$
0
0

経緯

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

シェル芸の片鱗を感じる


Viewing all articles
Browse latest Browse all 2722

Trending Articles