使用双引号而不是......时有什么区别?

时间:2014-06-01 22:40:00

标签: bash

我的代码非常简单,只是输出彼此不同。并且,我想知道为什么结果会像这样显示..

#!/bin/bash

fileList=`ls`  
echo $fileList   # without doubleQuote

输出

f1 f2 f3

#!/bin/bash

fileList=`ls` 
echo "$fileList" # with doubleQuote

输出

f1 
f2
f3

2 个答案:

答案 0 :(得分:5)

区别在于双引号禁用分词。例如,如果变量foo包含a b c,则"$foo"是单个参数(相当于'a b c'),而$foo则分为三个参数(相当于'a' 'b' 'c'或简称a b c)。

在您的示例中,fileList包含新行,双引号保留,而echo $fileList表示echo f1 f2 f3 - 所以它只是在它们之间打印空格,这就是echo当你给它多个参数时会这样做。

另一个差异,不适用于您的示例,但通常很重要,是双引号禁用文件名扩展。例如,如果变量foo包含a*,则echo "$foo"将打印a*,而echo $foo将打印当前目录中所有文件的名称以a开头。

你应该总是将你的变量扩展放在双引号中;如果你不这样做,就会出现太多问题。

答案 1 :(得分:0)

回答关于SO(https://stackoverflow.com/a/10388784/434551

的类似问题
  

$var"$var"之间的区别在于,扩展后shell会评估未加引号的变量扩展。就这样:

var='ls /'
$var
  

列出/,因为在扩展之后,shell将空间评估为标记分隔符,而

var='ls /'
"$var"
  

ls /: No such file or directory中的结果,因为在用户环境中没有名为ls /的命令。