2009-08-11 136 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

相关问题