(多个)双引号和变量

时间:2014-02-28 16:35:29

标签: bash

将多个双引号放入bash变量似乎与放一个或不引用双引号的结果相同。

例如,t1=at2="a"t3=""a"",回显它们会打印相同的结果:a。有什么不同吗?

最后,if [ $x == "valid" ]; thenif [ ""$x"" == "valid" ]; thenif [ "$x" == "valid" ]; then之间有什么区别?

3 个答案:

答案 0 :(得分:2)

连续引​​号只是多余的

这并不意味着不带引号的变量的行为类似于引用的变量。

以下示例应澄清:

$ set -x                       # enable xtrace
$ foo=""
+ foo=
$ [ -n $foo ] && echo y        # unquoted variable results in incorrect result for "string not empty" check
+ '[' -n ']'
+ echo y
y
$ [ -n "$foo" ] && echo y      # quoted variable results in correct result for the same check
+ '[' -n '' ']'
$ [ -n ""$foo"" ] && echo y
+ '[' -n '' ']'
$ echo "hey"
+ echo hey
hey
$ echo ""hey""                 # produces same result as in the previous case
+ echo hey
hey
$ echo """hey"""
+ echo hey
hey

答案 1 :(得分:1)

bash中的引用就像一个开关。当bash看到报价时,它会切换报价。当它看到另一个引号时,它会将其关闭。

因此echo ""a""echo a

相同

如果x为空或未设置,则必须在变量周围提供引号,否则bash会出错。

在处理文件时,引用非常重要。 $只是一个替换命令,如果你的文件名有空格,那么$只是扩展文件名。如果你周围没有引号,那么bash会将它视为两个单词而不是一个单词。

查看本教程。 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_03.html

答案 2 :(得分:0)

双倍双引号是空双引号。它并非严格无意义,因为它可以算作参​​数,例如:echo a becho a "" b不同。空双引号被视为参数,因此在b之间打印出两个空格。

echo ""at3=""a""对空双引号毫无意义。空字符串作为a的一部分包含在内,因此它没有效果。

进行变量检查的正确方法是:if [ "$x" = "some text" ]; then ... 如果x为空,则将其视为空参数(这是所需的行为。)

如果您跳过引号:if [ $x = "this is bad" ]; then ...,如果x为空,或者它包含空格,则会出现问题。测试甚至根本看不到x,并且=将是第一个参数。

如果x为空,在x:if [ ""$x"" = "this is bad" ]; then ...周围使用双引号实际上仍然可以正常工作。但是,如果x包含空格,则会出现问题。例如x="a b"。测试会将a和b视为单独的参数,这是没有意义的。

如果要在参数中包含文字双引号字符,请使用反斜杠:echo "\""echo \"

最终双引号的重点在于操纵命令行如何分割成参数。 echo "a"echo aecho ""a""都有一个'a'字符作为第一个参数,因此完全相同。 echo a becho "a b"不等同。第一个有两个参数,第二个只有一个。在第一种情况下,双空格将折叠为分隔参数的单个空格。在第二种情况下,双空格将作为参数的一部分保留。