定义带引号和不带引号的变量有什么区别?

use*_*123 3 bash quoting variable assignment tilde

如果我用引号定义一个变量:

TEMP="~/Dropbox"
Run Code Online (Sandbox Code Playgroud)

然后

ls $TEMP
Run Code Online (Sandbox Code Playgroud)

不会工作,而是

echo $TEMP | ls
Run Code Online (Sandbox Code Playgroud)

作品。

为了获得相同的结果,我还可以定义不带引号的变量,例如:

TEMP=~/Dropbox
Run Code Online (Sandbox Code Playgroud)

这样做我可以简单地输入

ls $TEMP
Run Code Online (Sandbox Code Playgroud)

我对它们之间的区别感到很困惑,我想知道我应该在何时何地分别使用这两种定义?

Joh*_*024 8

TEMP="~/Dropbox"
Run Code Online (Sandbox Code Playgroud)

上面定义了一个变量,它包含一个文字波浪号,后跟一个斜杠。因为它是在引号中,所以 shell 不会扩展~/到主目录。观察:

$ echo "quotes=~/" noquotes=~/
quotes=~/ noquotes=/home/john1024/
Run Code Online (Sandbox Code Playgroud)

因此,如果您想~/表示主目录,则~/需要在引号之外。以下工作:

TEMP=~/"Dropbox"
Run Code Online (Sandbox Code Playgroud)

让我们考虑一下如果~/用引号引起来会发生什么:

TEMP="~/Dropbox"
ls $TEMP
Run Code Online (Sandbox Code Playgroud)

上面的命令将查找文件,~/Dropbox意思是Dropbox在名为~. 由于您很可能没有名为 的目录~,因此ls将返回一条错误消息:“没有这样的文件或目录。”

此外,下面的命令不会按照您的想法执行:

echo $TEMP | ls
Run Code Online (Sandbox Code Playgroud)

ls忽略标准输入。一个裸ls命令只列出当前目录中的文件,无论该目录是什么。