シェルのエスケープ(bash/PowerShell/cmd)

入力した文字列をbashのシングル/ダブルクォート、PowerShellのクォート、cmd.exeの^エスケープと引数解析、JSON文字列・正規表現リテラルまで一括変換。引数リストから安全なコマンドライン1行も組み立てます。

bash(シングルクォート)
-
bash(ダブルクォート)
-
PowerShell(シングルクォート)
-
PowerShell(ダブルクォート)
-
cmd.exe(^ メタ文字エスケープ)
-
Windows引数解析("" ・CommandLineToArgvW方式)
-
JSON文字列
-
正規表現リテラル
-

cmd.exeの「^ メタ文字エスケープ」はcmd自身が解釈する& | < > ^ ( ) !を無効化するもの、「Windows引数解析」はプログラムが受け取るargvを組み立てる際の引用符・バックスラッシュの扱い(Cランタイム/CommandLineToArgvW方式)で、両者は別レイヤーです。バッチファイル内では%は%%と二重にする必要があります(このツールでは適用していません)。


bash 用コマンドライン
-
PowerShell 用コマンドライン
-
cmd.exe 用コマンドライン
-

スペースを含むファイル名を xargs や find -exec に渡すときは、既定の空白区切りで壊れないよう find . -print0 | xargs -0 ...(NUL区切り)や find . -exec cmd {} \;(1件ずつ実行)を使うのが安全です。

使い方

  1. 上の入力欄に文字列を入力すると、bash・PowerShell・cmd.exe・JSON・正規表現リテラルそれぞれの表記に即座に変換されます。
  2. 下の「引数リスト」に1行1引数でファイル名などを入力し、先頭コマンドを指定すると、そのまま貼り付けて実行できる安全な1行のコマンドラインが組み立てられます。
  3. 各結果は「コピー」ボタンでクリップボードに取得できます。

仕組み・各方式の根拠

bashのクォートはbash(1)マニュアルのQUOTING節に基づきます。シングルクォート内は原則すべてリテラルだが'自体は表現できないため、'\''(クォートを閉じ、エスケープした'を挟み、再び開く)という定型パターンで回避します。ダブルクォート内は\ $ ` "の4文字だけがバックスラッシュで特別な意味を持ちます。PowerShellはabout_Quoting_Rulesの規則に従い、シングルクォート内は'を''と2つ重ねる以外リテラル、ダブルクォート内はバッククォート`を エスケープ文字として`" `$ のように使います。

cmd.exeについては性質の異なる2つのエスケープを分けて表示しています。1つはcmd.exe自身が特別扱いする& | < > ^ ( ) !を^で無効化するメタ文字エスケープ、もう1つは呼び出されたプログラムが受け取るargvを組み立てる際の引用符・バックスラッシュの扱い(Microsoft C ランタイムおよびCommandLineToArgvWが採用する方式で、多くのWindows向けプログラムがこの規則で引数を解析します)です。後者は「直前のバックスラッシュの数を数え、"の前では2倍+1本にする」というアルゴリズムで、PythonのCPython実装(subprocess.list2cmdline)などでも同じ規則が使われています。

現場の落とし穴: cmd.exeでは^エスケープと""引用符方式が混在しがちで、「cmd自身の解釈」と「呼び出し先プログラムの引数解析」の2段階を混同すると意図しない結果になります。例えばバッチファイル内でだけ%を%%と二重にする必要があるのに、対話的なcmdプロンプトではその必要がない、という違いも典型的な混乱ポイントです。またfind -exec や xargs にスペースを含むファイル名を渡す際、既定の空白区切りのままだと1つのファイル名が複数の引数に分割されてしまうため、find . -print0 | xargs -0 command(NUL区切りで安全に渡す)や find . -exec command {} \;(1件ずつ確実に実行する)を使うのが定石です。

よくある質問

Q. なぜJSON文字列と正規表現リテラルも含まれているのですか?

A. ログ検索やAPI呼び出し用のクエリを組み立てる際、シェルのエスケープと同時にJSON文字列化や正規表現エスケープが必要になる場面が多いため、まとめて確認できるようにしています。

Q. PowerShellでシングルクォートとダブルクォート、どちらを使うべきですか?

A. 変数展開($var)やサブ式展開が不要ならシングルクォートの方が意図しない展開を防げて安全です。変数を埋め込みたい場合のみダブルクォートを使い、リテラルの$が必要な箇所は`$でエスケープします。

Q. bashのダブルクォートの結果に!のエスケープが含まれないのはなぜですか?

A. !はインタラクティブシェルの履歴展開(history expansion)が有効なときにのみ特別な意味を持ち、スクリプト実行時や履歴展開が無効な場合は通常の文字として扱われるため、既定では対象に含めていません。対話シェルで使う場合は個別に\!へ置き換えてください。

関連ツール

最終更新・根拠の確認日: 2026-09-10 · カテゴリ: Linux・サーバー