2009-08-11 9 views
1

この質問はあなたの一部には愚かに見えるかもしれませんが、私はここに学びます。
これらの仮定はほとんどの言語で当てはまりますか?
EDIT:OK、私はPerl/Bashスクリプティングについて話しているとしましょう。(ネストされた|ダブル|シンプルな)引用符の正しい使い方

'Single quotes' 

=>全く解釈(例えば '$' または任意のメタ文字は、文字とみなされると、画面に印刷されます)

"Double quotes" 

=>変数の解釈

へ私の懸念についてより正確に言えば、私はいくつかのシェルスクリプトを書いています(引用符は時には大きな混乱となることがあります)、次の行を書いています:

CODIR=`pwd | sed -e "s/$MODNAME//"` 

私のsedで一重引用符を使用していた場合、私のパターンは '$ MODNAME'でしたでしょうか? (とは、この特定のケースでは、 `アルファ」です$ MODNAMEの実際の値は、)

私が持っていたもう一つの問題は、エコー内側にawkを持つ:

USAGE=`echo -ne "\ 
Usage : ./\`basename $0\` [-hnvV]\n\ 
\`ls -l ${MODPATH}/reference/ | awk -F " " '$8 ~ /\w+/{print "> ",$8}'\`"` 

私はその1をデバッグするいくつかの時間を費やし。私は、インタプリタがコマンドを "分割"せず(そして "basename"の直前で止まるように)バッククエストがエスケープされたという結論に達しました。 awkコマンドでは、 '$ 8'はawkによってうまく解釈されるので、シェルでは正しく解釈されません。シェル変数を使いたいのですが?私はawk -F "\" $ MY_SHELL_VAR \ ""と書くでしょうか? $ MY_SHELL_VARはそのままで、awkによって解釈されるでしょうか?

クォートやバッククッキーに関する情報を追加することをためらわずに!

ありがとうございました! :)

+0

私はシェルスクリプトを使用してタグ付けし直しました。なぜなら、あなたの質問に基づいているように見えるからです。要するに、すべてのプログラミング/スクリプト言語は、さまざまな引用符を独自の方法で扱います。 – aberrant80

答えて

7

それは言語によって大量に異なります。たとえば、C/Java/C++/C#etcファミリでは、文字列には一重引用符を使用できません。

一般化しようとするより実際に興味のある言語のルールを正しく学習する方がはるかに良いと思います。

+0

あなたは絶対に正しいです、私はPerlとShellに溺れて、他の知られている言語について忘れてしまいました。<_ < –

4

これらの仮定はほとんどの言語で当てはまりますか?

回答:いいえ

2

間違いなくすべての言語で同じです。たとえば、Pythonでは、一重引用符と二重引用符は同じ意味を持ちます。唯一の違いは、エスケープせずに二重引用符で囲んだ文字列に一重引用符を含めることができることです(逆に "どうしますか?")。

また、複数の行にまたがる三重引用符付きの文字列があります。

+0

面白い、ありがとう! –

1

はい、何かが動作しますが、この場合awkで変数を使用することはできません。シェルによって解釈されるので、このようになります(コマンドを使用しますあなたが気にしない場合はあなたよりも簡単です):

awk -F " " '$8 ~ /\w+/{print "> ",$8, '$SOME_SHELL_VAR'}' 

一重引用符の終了と再起動に注意してください。

最も難しい部分は、通常、コマンドの引数に引用符を渡すことです。単一引用符は、「\」ウォン」以来、単一引用符の内側にエスケープすることができないこと

awk '$1 ~ '\''{print}' 

注:この場合、あなたは、単一引用符を終了エスケープ引用符を追加し、再見積もりを開始し、次のようにする必要がありますエスケープ文字として扱われます。

これはおそらくあなたの眠気には直接関係しませんが、それでも役立ちます。

+0

これは間違いなく関連しています、ありがとう! awkの部分は賢いです、私は決して自分でそれを考えていたでしょう^^ –

+0

まあ、正直言って、私はそれ自身も考えていませんでした。 –

+0

awk ... '...' "$ SOME_VAR" '...'というシェル変数を二重引用符で囲みます。 awk -v var = "$ SOME_VAR" 'var〜/ pattern/{...}' –

1

私はperlについてはわかりませんが、bashでは改行をバックスラッシュする必要はありません。

私は引用符として、私は "五重引用符"パターンと呼ばれる(非常に個人的な)パターンを持っています。これは、例えば、引用符

の同じ種類で囲まれた文字列内の1つのクォートを置くのに役立ちます:あなたがしたい場合に便利です、あなたが自由に引用符の異なる種類の文字列を追加することができ

doublequoted="some things "'"'"quoted"'"'" and some not" 
simplequoted='again '"'"'quote this'"'"' but not that' 

注意、

awk -F " " '$8 ~ /\w+/{print "> ",$8, '"$SOME_SHELL_VAR"'}' 

はまた、私はもうバッククォートを使用していないが、より読みやすいですし、入れ子にすることができ$(...)パターン:シェルは、いくつかのVARSではなく、いくつかの他のinterpreteします。

USAGE=$(echo -ne " 
Usage : ./$(basename $0) [-hnvV]\n 
$(ls -l ${MODPATH}/reference/ | awk -F " " '$8 ~ /\w+/{print "> ",$8}')") 
+0

ありがとう;) –

1

perlでは、二重引用符で囲まれた文字列の変数が展開されます。

あなたはインスタンスのことを書いた場合:

my $email = "[email protected]" ; 

perlが@barを拡大しようとします。 use strictの場合は、アレイバーが存在しないという苦情が表示されます。あなたがしなければ、あなたはちょうど奇妙な行動を見るでしょう。

だから、書くことが良いでしょう。理由は、これらのタイプのために

my $email = '[email protected]' ; 

、私のアドバイスはあなたが変数の展開が必要であることを知っている限り、常に、文字列を単一引用符を使用することです。 Perlで

2

、あなたも(Qを持っている)と、ネストされた引用の状況であなたを助けるためにQQ():

my $x = q(a string with 'single quotes'); 
my $y = qq(an $interpreted string with "double quotes"); 

これらは確かに不 '\' がエスケープ "" \ "\" あなたが防ぐことができます\内部引用符。

+0

ニース!情報をありがとう ! –

+0

これはPerlではqとqqでなければなりません。 %q()&%Q()はRubyの同等のものです。 – draegtun

+0

よろしくお願いいたします。あなたは私が最近自分の時間を過ごしていた場所を知ることができます... –

4

bashスクリプトでは、ネストされた引用符とエスケープがどのように動作するのかが分かりませんので、部分的にはbackticks are deprecated in favor of $()です。 Bash Pitfallsをご覧ください。

+0

ありがとう!それはまさに私が探していたものです。 –

関連する問題