2009-08-11 43 views
1

我相信這個問題對你們中的一些人來說似乎是愚蠢的,但我在這裏學習。
這些假設是否適用於大多數語言?
編輯:好的,讓我們假設我在談論Perl/Bash腳本。什麼是(嵌套|雙|簡單)引號的正確用法

'Single quotes' 

=>沒有解釋在所有(如 '$' 或任何元字符將被視爲一個字符,將在篩網印花)

"Double quotes" 

=>可變解釋

要更準確地說我的擔憂,我正在寫一些shell腳本(其中引號有時可能是一個很大的麻煩),並寫下這一行:

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}'\`"` 

我花了一些時間調試一個。我得出這樣的結論,反引號是逃脫的,所以解釋者不會「分裂」命令(並在«basename»之前停止)。在awk命令中,'$ 8'被awk成功解釋,因此不被shell解釋。如果我想使用shell變量呢?我會寫awk -F「\」$ MY_SHELL_VAR \「」嗎?因爲$ MY_SHELL_VAR就是這樣,會被awk解釋,不是嗎?

不要猶豫,添加任何關於報價或反引號的信息!

謝謝! :)

+0

我用shell腳本來重新簽名,因爲這就是你的問題所在。簡而言之,每種編程/腳本語言都以各自的方式處理各種引用。 – aberrant80 2009-08-11 08:07:10

回答

7

它通過大量的語言不同。例如,在C/Java/C++/C#等系列中,根本不能爲單個字符使用單引號 - 它們僅適用於單個字符。

我認爲對於你真正感興趣的語言正確學習規則要比嘗試概括更好。

+0

你是對的,我很溺愛Perl和Shell,我忘了我的其他已知語言<_ < – 2009-08-11 08:09:39

4

這些假設是否適用於大多數語言?

答:沒有

2

這對所有語言來說絕對不一樣。例如,在Python中,單引號和雙引號是可以互換的。唯一的區別是,您可以在雙引號字符串中包含單引號而不會轉義它們,反之亦然(「最近怎麼樣?」)。

此外,還有三重引號字符串可以跨越多行。

+0

有趣,謝謝! – 2009-08-11 08:10:49

1

是的,像awk -F "\"$MY_SHELL_VAR\""這樣的東西可以工作,但在這種情況下,你將無法在awk中使用變量,因爲它們將被shell解釋,所以走的路是這樣的(我將使用命令比你的簡單,如果你不介意:)):

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

注意單引號終止和重新啓動。

最棘手的部分通常是將參數中的引號傳遞給命令。在這種情況下,你需要再次終止單引號,加轉義引號,開始報價,這樣的:

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

。注意,單引號不能單引號進行轉義,因爲「\」榮獲」不要視爲轉義字符。

這可能與您的quiestion不直接相關,但仍然有用。

+0

這絕對是相關的,謝謝! awk的部分是聰明的,我從來沒有想到我自己^^ – 2009-08-11 08:20:27

+0

嗯,說實話,我也沒有想到它自己:)我發現它在某個時間以前在網絡上的某個地方。 – 2009-08-11 08:26:30

+0

您仍然想要雙引號shellvar:awk ...'...'「$ SOME_VAR」'...'。更好的是,使用-v選項將變量傳遞給awk:awk -v var =「$ SOME_VAR」'var〜/ pattern/{...}' – 2009-08-11 16:22:12

1

我不知道perl,但是對於bash,你不需要反斜線換行符。

至於引號,我有一個(非常個人的)模式,我稱之爲「五引號」模式。它有助於把一個報價由同一種引號

。例如包圍的字符串:

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

注意,您可以自由地與不同類型的引號,當你想這是非常有用的字符串追加外殼interprete一些增值經銷商,但沒有其他一些:

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

另外,我不使用反引號了,但在$(...)模式哪個更清晰,可以被嵌套。

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

感謝那個;) – 2009-08-11 08:41:23

1

在perl中,雙引號字符串將使其變量擴展。

如果你寫例如:

my $email = "[email protected]" ; 

的perl將嘗試擴大@bar。如果你use strict,你會看到抱怨陣列欄不存在。如果你不這樣做,你會看到一個奇怪的行爲。

所以最好這樣寫:

my $email = '[email protected]' ; 

對於這些類型的原因,我的建議是始終使用單引號字符串,除非你知道你需要變量擴展。

2

在Perl中,你也有Q()和QQ(),以幫助您在嵌套的報價情況:

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

這些一定會幫助你避免 「\」 不必要\ 「」 '\' 逃逸\ ''內部報價。

+0

不錯!謝謝(你的)信息 ! – 2009-08-12 07:13:04

+0

這應該是q和qq在Perl中。 %q()&%Q()是Ruby的等價物。 – draegtun 2009-08-12 11:11:38

+0

對,謝謝。你可以告訴我最近在哪裏花時間... – 2009-08-12 14:34:15

相關問題