Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux &引用;ls";对于名称中有空格的目录,可以在cmd行中工作,但不能在脚本中工作_Linux_Bash_Shell_Ls - Fatal编程技术网

Linux &引用;ls";对于名称中有空格的目录,可以在cmd行中工作,但不能在脚本中工作

Linux &引用;ls";对于名称中有空格的目录,可以在cmd行中工作,但不能在脚本中工作,linux,bash,shell,ls,Linux,Bash,Shell,Ls,我是bash脚本的初学者,我正在尝试编写一个脚本,该脚本将变量作为目录名,并使用这些变量值来运行简单的bash命令,如“ls”和“cd”。例如,当目录有一个“普通”名称时,它工作得非常好 testfolder/folder01 但是,当目录的名称中有空格和括号时,就会失败,例如,当您复制一个子目录并粘贴到包含该子目录的同一目录中时,就会发生这种情况。此脚本中可以看到问题: [boblacerda@localhost MyScripts]$ cat test.sh #!/bin/bash VARD

我是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]$
谢谢大家的关注。

试试:

ls "$VARDIR"

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

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

$ cat test.sh

#!/bin/bash
VARDIR="testfolder/folder01"
ls "$VARDIR"
VARDIR="testfolder/folder01 (copy)"
ls "$VARDIR"
设置VARDIR时,可以使用反斜杠或引号,但不能同时使用这两种方法:


脚本中引用过多。我相信命令行中的
ls“testfolder/folder01\\(copy\)”
也会失败。请转义空格或引用字符串。为什么要使用反斜杠?您可以尝试在脚本中设置
IFS=$'\n'
。只有当文件名中有换行符时,它才会中断。如果文件名有换行符,可以尝试
find-print0
。此外,还可以查看使用单引号字符和双引号字符之间的差异。当使用单引号时,扩展方式与使用双引号时不同。我知道双引号解决了您的问题,但了解原因很重要。这里有一个不错的总结。VARDIR=“testfolder/folder01(copy)”;ls“$VARDIR”对我来说很好,但不管怎样。谢谢!这成功了!我使用VARDIR=“testfolder/folder01(copy)”解决了这个问题。@yellowantphil我不知道,我只是做了。非常感谢。
VARDIR="testfolder/folder01 (copy)"
VARDIR=testfolder/folder01\ \(copy\)