1

我敢肯定,这个问题对你们中的一些人来说可能看起来很愚蠢,但我是来学习的。
对于大多数语言,这些假设是否正确?
编辑:好的,假设我在谈论 Perl/Bash 脚本。

'Single quotes'

=> 完全没有解释(例如,'$' 或任何元字符将被视为一个字符并将打印在屏幕上)

"Double quotes" 

=> 变量解释

为了更准确地表达我的担忧,我正在编写一些 shell 脚本(其中的引号有时会很麻烦),并写下了这一行:

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

如果我在我的 sed 中使用了单引号,我的模式将是 '$MODNAME',对吗?(而不是 $MODNAME 的实际值,在这种特殊情况下是“alpha”)

我遇到的另一个问题是在 echo 中有一个 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 解释,不是吗?

不要犹豫,添加有关引用或反引号的任何信息!

谢谢 !:)

4

8 回答 8

7

它因语言而异。例如,在 C/Java/C++/C# 等系列中,您根本不能对字符串使用单引号 - 它们仅用于单个字符。

我认为为你真正感兴趣的语言正确地学习规则比试图概括要好得多。

于 2009-08-11T08:06:28.877 回答
4

对于大多数语言,这些假设是否正确?

答案:没有

于 2009-08-11T08:06:03.777 回答
4

在 bash 脚本中,不推荐使用反引号来支持 $(),部分原因是嵌套引号和转义应该如何工作并不明显。您可能还想看看Bash Pitfalls

于 2009-08-11T22:17:04.930 回答
2

绝对不是所有语言都一样。例如,在 Python 中,单引号和双引号是可以互换的。唯一的区别是您可以在双引号字符串中包含单引号而不转义它们,反之亦然(“最近怎么样?”)。

此外,还有可以跨越多行的三引号字符串。

于 2009-08-11T08:07:51.400 回答
2

在 Perl 中,您还可以使用 q() 和 qq() 来帮助您解决嵌套引用的情况:

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

这些肯定会帮助您避免 "\"needlessness\"" '\'escaping\'' 内部引号。

于 2009-08-11T16:21:35.177 回答
1

是的,类似的东西awk -F "\"$MY_SHELL_VAR\""会起作用,但是在这种情况下,您将无法在 awk 中使用变量,因为它们将由 shell 解释,所以要走的路是这样的(我将使用比您更简单的命令,如果你不介意:)):

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

请注意单引号终止和重新启动。

通常,最棘手的部分是将参数中的引号传递给命令。在这种情况下,您需要终止单引号,添加转义的引号字符,再次开始引用,如下所示:

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

请注意,单引号不能在单引号内转义,因为“\”不会被视为转义字符。

这可能与您的问题没有直接关系,但仍然有用。

于 2009-08-11T08:16:46.640 回答
1

我不知道 perl,但对于 bash 你不需要反斜杠换行符。

至于引号,我有一个(非常个人的)模式,我称之为“五引号”模式。它有助于将一个引号放在由相同类型引号括起来的字符串中

例如:

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

请注意,您可以自由地附加带有不同类型引号的字符串,这在您希望 shell 解释一些 var 而不是其他一些时很有用:

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}')")
于 2009-08-11T08:20:17.443 回答
1

在 perl 中,双引号字符串将扩展其变量。

例如,如果您这样写:

my $email = "foo@bar.com" ;

perl 将尝试扩展@bar. 如果你use strict,你会看到一个关于数组栏不存在的抱怨。如果你不这样做,你只会看到一个奇怪的行为。

所以最好写:

my $email = 'foo@bar.com' ;

出于这些原因,我的建议是始终对字符串使用单引号,除非您知道需要变量扩展。

于 2009-08-11T14:25:32.367 回答