将多个双引号放入bash变量似乎与放一个或不引用双引号的结果相同。
例如,t1=a
,t2="a"
,t3=""a""
,回显它们会打印相同的结果:a
。有什么不同吗?
最后,if [ $x == "valid" ]; then
,if [ ""$x"" == "valid" ]; then
和if [ "$x" == "valid" ]; then
之间有什么区别?
答案 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 b
与echo a "" b
不同。空双引号被视为参数,因此在b之间打印出两个空格。
echo ""a
和t3=""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 a
和echo ""a""
都有一个'a'字符作为第一个参数,因此完全相同。 echo a b
和echo "a b"
不等同。第一个有两个参数,第二个只有一个。在第一种情况下,双空格将折叠为分隔参数的单个空格。在第二种情况下,双空格将作为参数的一部分保留。