web-dev-qa-db-ja.com

二重引用符の中に二重引用符をエスケープする方法は?

誰かが私にbashの二重文字列の中の二重引用符をエスケープする方法を教えてもらえますか?

例えば私のシェルスクリプトでは

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

二重引用符付きのENCLOSED BY \"を正しく取得できません。変数$dbtableを使いたいので、変数に一重引用符を使用できません。

234
Sean Nguyen

円記号を使用してください。

echo "\""     # Prints one " character.
249
Peter

シェルで引用符をエスケープする簡単な例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

これは、既に開いているもの(')を終了し、エスケープしたもの(\')を配置してから、別のもの(')を開くことによって行われます。

あるいは

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

既に開いているもの(')を終え、他の引用("'")に引用を入れてから、別のもの(')を開くことによってそれが行われます。

その他の例: 一重引用符で囲まれた文字列内の一重引用符のエスケープ

60
kenorb

この古い問題が今日bashタグ付きリストに表示された理由はわかりませんが、将来の研究者に備えて、エコーする必要がある文字のASCIIコードを使用することでエスケープを回避できることを忘れないでください。例:

echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"                                                                                                          
this is "'"'"text"'"'" 

\x22は、二重引用符の場合はASCIIコード(16進数)、単一引用符の場合は\x27です。同様に、あなたは任意の文字をエコーすることができます。

上記の文字列をバックスラッシュでエコーしようとすると、2行のバックスラッシュエコーが必要になります。

変数代入の場合、これは等価です。

$ a=$'this is \x22text\x22'                                                                                                                                               
$ echo "$a"                                                                                                                                                               
this is "text"

変数が別のプログラムによってすでに設定されている場合でも、sedまたは同様のツールを使用して二重引用符または一重引用符を適用できます。例:

$ b="just another text here"
$ echo "$b"
just another text here
$ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
just another "0" here #this is not what i wanted to be
$ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.
46
George Vasiliou

Bashを使用すると、文字列を隣接して配置することができ、それらは単に接着されてしまいます。

したがって、この:

$ echo "Hello"', world!'

生産する

Hello, world!

秘Theは、必要に応じて、単一引用符と二重引用符で囲まれた文字列を切り替えることです。残念ながら、すぐに非常に面倒になります。例えば:

$ echo "I like to use" '"double quotes"' "sometimes"

生産する

I like to use "double quotes" sometimes

あなたの例では、このようなことをします:

$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload

次の出力が生成されます。

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

ここで何が起こっているかを見るのは難しいですが、Unicode引用符を使用して注釈を付けることができます。以下はbashでは機能しません。これは単に説明のためのものです。

dbload='load data local infile " '“ 'gfpoint.csv'”' " into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"' " '"' LINES"' TERMINATED BY " '“ '\n'”' " IGNORE 1 LINES '

上記の「」のような引用符は、bashによって解釈されます。 " 'のような引用符は結果の変数になります。

前の例と同じ扱いをすると、次のようになります。

$ echoI like to use” ‘"double quotes"’” sometimes

23
Beetle

チェックアウトprintf...

#!/bin/bash
mystr="say \"hi\""

Printfを使わずに

echo -e $mystr

出力: "hi"と言う

printfを使う

echo -e $(printf '%q' $mystr)

出力:say\"hi \"

14
Danny Hong

二重引用符を変数として格納します。

 dqt = '"' 
 echo"二重引用符で囲まれた文字列内の$ {dqt} X $ {dqt}を二重引用符で囲みます。

出力:

二重引用符で囲まれた文字列内の "X"を二重引用符で囲みます
13
12oclocker

$ "string"を利用してください。

この例では、

dbload = $ "データローカルinfile \" 'gfpoint.csv'\"をテーブル$ dbtableにロードします。

注( のマニュアルページ から):

ドル記号($ "string")が前に付いた二重引用符で囲まれた文字列は、現在のロケールに従って文字列を翻訳します。現在のロケールがCまたはPOSIXの場合、ドル記号は無視されます。文字列が翻訳されて置き換えられると、置き換えは二重引用符で囲まれます。

9