" LS"适用于cmd行,但不适用于脚本中名称中包含空格的目录

时间:2015-01-28 19:28:01

标签: linux bash shell ls

我是bash脚本的初学者,我正在尝试编写一个脚本,其中包含变量目录名,并使用这些变量值运行简单的bash命令,如“ls”和“cd”。当目录具有“普通”名称时,它完全正常,例如

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]$

如您所见,第一部分使用具有“普通”名称的目录,但第二部分使用名称中带有空格和括号的目录,则会失败。如果我在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]$

谢谢大家的关注。

2 个答案:

答案 0 :(得分:2)

您的脚本有两个问题。首先,您没有正确设置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\)

答案 1 :(得分:1)

尝试:

ls "$VARDIR"

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