我的代码非常简单,只是输出彼此不同。并且,我想知道为什么结果会像这样显示..
#!/bin/bash
fileList=`ls`
echo $fileList # without doubleQuote
输出
f1 f2 f3
#!/bin/bash
fileList=`ls`
echo "$fileList" # with doubleQuote
输出
f1
f2
f3
答案 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 /
的命令。