Linuxのシェルでコマンドを実行する際、--option "引数" のようにダブルクォーテーションで引数を囲むことがあります。
しかし、その引数の中にさらにダブルクォーテーション(”`”)を含めたい場合、うまくいかないことがあります。
この記事では、そんな場面での正しい書き方やエスケープ方法について解説します。
なぜダブルクォーテーションで囲むのか?
まず、Linuxコマンドで引数を " " で囲む主な理由は、スペースや特殊文字を1つの引数として認識させるためです。
mycmd --message "This is a test message"
これは "This is a test message" 全体が1つの引数になることを意味します。
引数内にダブルクォーテーションを含めたいケース
たとえば、次のような文字列を引数にしたいとします:
{"key": "value"}
このように JSON形式などで、内部にもダブルクォーテーションが必要な場合があります。単純に以下のように書いてもエラーになります:
mycmd --data "{"key": "value"}"
対処法:ダブルクォーテーションをエスケープする
シェルでは、文字列中の " を表現するためにはバックスラッシュでエスケープする必要があります:
mycmd --data "{\"key\": \"value\"}"
このように書けば、シェルは中の " を文字として解釈し、意図通りの引数になります。
シングルクォートを使う方法
もうひとつの方法として、外側をシングルクォート ' ' で囲むことも可能です。シングルクォート内では " をエスケープせずに使えます:
mycmd --data '{"key": "value"}'
こちらの方が読みやすく、JSONのように " を多用する文字列では推奨される方法です。
シングルクォート内にシングルクォートを含めたいときは?
まれに、シングルクォート ' を引数に含めたい場合もあります。例えば:
rustコピーする編集するHere's an example
これを引数として渡すには、外側をダブルクォートにし、内側の ' はそのまま使うことで実現できます:
bashコピーする編集するmycmd --comment "Here's an example"
逆に、' を含む文字列をシングルクォートで囲むとエラーになります。
まとめ
| 目的 | 方法例 |
|---|---|
引数内に " を含める | --opt "{\"key\": \"val\"}" |
| JSONをそのまま渡す | --opt '{"key": "val"}' |
' を含む文字列を渡す | --opt "Here's something" |
シェルでは、クォートの使い分けとエスケープは非常に重要です。エラーや意図しない動作の多くは、クォートの扱いミスによるものです。基本をおさえておくだけで、複雑な引数も安心して扱えるようになります。


コメント