2012-08-15 10 views
38

私は、文字列等'$'のような任意の文字、'\'を含むことができると私はbashはいずれかを行うにはしたくないドル記号がBashの一重引用符にどのように影響しますか?

program "don't do this" 

例えば、バッシュCLIから引数としてプログラムに文字列を渡す必要があります変形。ですから、私は一重引用符を使うことを考えています。

次は動作しません。しかし:

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

を次の二つの作品中:それは(前にドル記号を置くあまり、事前の変更を取得し、その中で最初のアプローチが良さそうです

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

\\\に置き換えてください)。しかし、私はそれ以外に何ができるでしょうか?

私は本当にこれをGoogleで検索しましたが、私は私が必要なものを見つけることができません...

+4

「$ '...」の例を理解するには、[bash info page](http://www.gnu.org/software/bash)の最初の段落を見てください。 /manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting) – suvayu

+0

この質問を投稿していただきありがとうございます。タブ区切りのレコード(つまり、 'cat myData.tsv | column -t -s $ '\ t'')を整列させる方法を理解する上で重要です。 –

答えて

48

それはエスケープシーケンスを解釈されます。接頭辞として$を使用して

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

(そしてSO間抜けな方法でタブを扱うので、自宅でこれを試してみてください)

+0

+1良いキャッチです。変数名が拡張されているので、これが起こると思いますか? –

+0

いいえ、これは '$ '...''の動作が定義されているためです。 –

+0

これはまさに私が必要とするものです。 – user1206899

18

は、その名前の変数を見つけようとするBASHに指示します。 $'は、ANSI-C文字列処理を可能にする特殊な構文(fully explained here)です。この場合、1つのティックは「次の1つのティックまでそのまま受け入れる」というわけではありません。それは使用するのが非常に安全でなければなりません。欠点はそれがBASHだけであり、非常に珍しいので、多くの人々はそれが何を意味するのだろうかと思います。

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

代わりに、それぞれの単一ティックを'"'"'と再翻訳します。これは、「現在の単一引用符で囲まれた文字列を終了し、単一のティックを含む二重引用符付き文字列を追加します。これは、エスケープ文字を避け、きれいに対称に見えます。二重引用符で囲まれた文字列に二重引用符が必要な場合は、逆の動作もします:"'"'"

+0

はいそれは正しい方法です – user1206899

+2

''' '"' 'を見るのが一般的です。例えば ​​'' the dog '' '' s tail'' –

+0

$ 'SHELL'と$ 'LANG'は*失敗*しません。 $ 'のドル記号は異なる機能を持っています。私は '\'は* 1 *正しい方法だと言うでしょう。 – jox

-1

あなたがより速くまたはより効率的な方法を見つけることができません。一つは

eval RESULT=\$\'$STRING\' 

、これはevalをがためにそこにあることを事の一種であり、あなたがサブプロセスをフォークの狂気のコストを避けます前の答えが示唆しているように、どこにでもあります。あなたの例:

$ foo='\u25b6' 
$ eval bar=\$\'$foo\' 
$ echo "$bar" 
▶ 
+0

これは、Bashの構文の意味を誤解しています。 '$ '...''は、通常の文字列とは異なる引用規則に従う[Cスタイルの文字列](http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting)です。このページの他の回答に概説されているように。 – tripleee

関連する問題