"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\)
我是 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\)