77

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

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

私は本当にこれをグーグルで検索しましたが、必要なものが見つかりません...

4

3 に答える 3

110

これにより、エスケープ シーケンスが解釈されます。

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

これらのシーケンスが展開された後、ドル記号が存在しないかのように、結果は単一引用符で囲まれます。

于 2012-08-15T08:46:16.940 に答える
36

プレフィックスとして使用$すると、BASH はその名前の変数を見つけようとします。ANSI-C 文字列処理を可能に$'する特別な構文 (ここで完全に説明されています) です。この場合、単一のティックは「次の単一のティックまで逐語的に値を取る」ではありません。これは非常に安全に使用できるはずです。欠点は、これが BASH のみであり、非常に珍しいことです。そのため、多くの人がそれが何を意味するのか不思議に思うでしょう。

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

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

于 2012-08-15T08:48:14.763 に答える