我是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]$
谢谢大家的关注。
答案 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"
双引号将保留空格,不需要反斜杠。