"ls" 在 cmd 行中工作,但在名称中带有 space 的目录的脚本中不工作

"ls" works in cmd line but not in script for directories with space in their names

我是 bash 脚本编写的初学者,我正在尝试编写一个具有变量目录名称的脚本,并将这些变量值用于 运行 简单的 bash 命令例如 "ls" 和 "cd"。当目录有一个 "normal" 名称时,它工作得很好,例如

testfolder/folder01

但是,当目录名称中包含空格和括号时,就会失败,例如,当您复制一个子目录并粘贴到包含该子目录的同一目录时,就会发生这种情况。可以在这个脚本中看到问题:

[boblacerda@localhost MyScripts]$ cat test.sh
#!/bin/bash
VARDIR="testfolder/folder01"
ls $VARDIR
VARDIR="testfolder/folder01\ \(copy\)"
ls $VARDIR
[boblacerda@localhost MyScripts]$

这是调试模式下脚本的输出:

[boblacerda@localhost MyScripts]$ bash -x test.sh
+ VARDIR=testfolder/folder01
+ ls testfolder/folder01
testefile01  testefile02
+ VARDIR='testfolder/folder01\ \(copy\)'
+ ls 'testfolder/folder01\' '\(copy\)'
ls: cannot access testfolder/folder01\: No such file or directory
ls: cannot access \(copy\): No such file or directory
+ exit
[boblacerda@localhost MyScripts]$

如您所见,第一部分使用名称为 "normal" 的目录有效,但第二部分使用名称中包含空格和括号的目录失败。如果我在 ls 命令中引用 VARDIR,即如果我像这样使用 ls

,问题仍然存在

ls "$VARDIR"

这种情况下的输出是这样的:

[boblacerda@localhost MyScripts]$ bash -x test.sh
+ VARDIR=testfolder/folder01
+ ls testfolder/folder01
testefile01  testefile02
+ VARDIR='testfolder/folder01\ \(copy\)'
+ ls 'testfolder/folder01\ \(copy\)'
ls: cannot access testfolder/folder01\ \(copy\): No such file or directory
+ exit
[boblacerda@localhost MyScripts]$

最后要补充的是命令

ls testfolder/folder01\ \(copy\)

在 cmd 中工作正常,如下所示:

[boblacerda@localhost MyScripts]$ls testfolder/folder01\ \(copy\)
testefile01  testefile02
[boblacerda@localhost MyScripts]$

谢谢大家的关注

尝试:

ls "$VARDIR"

双引号将保留 space,不需要反斜杠。

您的脚本有两个问题。首先,您没有正确设置 VARDIR 因为反斜杠太多。其次,您应该在任何变量的任何使用处加上引号。

$ cat test.sh

#!/bin/bash
VARDIR="testfolder/folder01"
ls "$VARDIR"
VARDIR="testfolder/folder01 (copy)"
ls "$VARDIR"

设置 VARDIR 时,您可以使用反斜杠或引号,但不能同时使用两者:

VARDIR="testfolder/folder01 (copy)"

VARDIR=testfolder/folder01\ \(copy\)