web-dev-qa-db-ja.com

先頭のドル記号はBashの単一引用符にどのように影響しますか?

文字列をBash CLIからの引数としてプログラムに渡す必要があります。

program "don't do this"

文字列には、'$''\'などの任意の文字を含めることができ、Bashに変更を加えたくありません。だから私は単一引用符を使うことを考えます。

ただし、以下は機能しません。

 program 'don\'t do this'            //escape doesn't work in single quote

次の2つは機能しますが、

 program $'dont\'t do this'          //seems fine, but any other side effects?
 program 'dont'\''do this'           //breaking into 3 parts

最初のアプローチは、修正前の取得が少ない(ドル記号を前に置き、すべての\\\に置き換える)点で優れているように見えますが、ドル記号が他に何をするのかわかりません。

私は本当にこれをググってみましたが、必要なものが見つかりません...

59
user1206899

エスケープシーケンスが解釈されます。

$ echo $'Name\tAge\nBob\t24\nMary\t36'
Name    Age
Bob     24
Mary    36

(SOは間抜けな方法でタブを処理するので、これを自宅で試してください)

$を接頭辞として使用すると、その名前の変数を検索するようにBASHに指示します。 $'は、ANSI-C文字列処理を可能にする特別な構文( ここで完全に説明 )です。この場合、単一ティックは「次の単一ティックまで逐語的に値を取る」ではありません。安全に使用できます。欠点は、それがBASHのみであり、非常にまれであるため、多くの人々はそれが何を意味するのか疑問に思うでしょう。

より良い方法は、単一引用符を使用することです。文字列に一重引用符が必要な場合は、'\''で置き換える必要があります。これにより、前の単一引用符付き文字列が終了し、それに単一引用符が追加され(\')、新しい単一引用符付き文字列が開始されます。この構文は Bourne Shell のすべての子孫で機能します。理解するのは非常に簡単で、ほとんどの人はすぐにパターンを認識します。

別の方法は、'"'"'を使用して各単一ティックを更新し、「現在の単一引用符付き文字列を終了し、単一ティックのみを含む二重引用符付き文字列を追加し、単一引用符付き文字列を再開する」に変換します。これにより、エスケープ文字が回避され、見た目が対称的になります。二重引用符で囲まれた文字列に二重引用符が必要な場合は、逆の方法でも機能します:"'"'"

23
Aaron Digulla