我正在尝试构建一个脚本,我需要能够管理名称中是否带有空格和/或反斜杠的目录。
在 bash 脚本中或直接在 bash shell 上使用变量进行测试,我无法更改为其中包含转义空格的目录,我可以手动执行此操作,但如果我将其放在变量中并尝试使用该变量更改目录,则无法做到。
例子:
我想要 cd 到的目录:
MY\ DIRECTORY\ WITH\ STRANGE\ \[CHARACTERS\]
在 bash 提示符下我可以通过 cd 转到它:
cd MY\ DIRECTORY\ WITH\ STRANGE\ \[CHARACTERS\]
但如果我把导演的名字放在变量中,我就不能:
TEST="MY\ DIRECTORY\ WITH\ STRANGE\ \[CHARACTERS\]"
cd "$TEST"
-bash: cd:MY\ DIRECTORY\ WITH\ STRANGE\ \[CHARACTERS\]: no such file or directory
那么,有没有办法以干净透明的方式处理 bash shell 中的反斜杠?
我可以从字符串中删除反斜杠,但这会引入一些棘手的目录名称变量扩展问题......
答案1
如果您坚持使用反斜杠目录名$TEST
,您可以尝试:
cd "${TEST//\\/}"
man bash
“参数扩展”部分的解释:
${参数/模式/字符串}
模式替换。模式被扩展以产生一个模式,就像在路径名扩展中一样。参数被扩展,模式与其值的最长匹配被替换为字符串。如果模式以 / 开头,则模式的所有匹配都将被替换为字符串。通常只替换第一个匹配。...
换句话说,我们用空字符替换//
反斜杠的“所有匹配项”()\\
,因为我们需要转义反斜杠。
但是如果您可以从变量名中删除反斜杠,那么您尝试执行的操作就会有效:
TEST="MY DIRECTORY WITH STRANGE [CHARACTERS]"
cd "$TEST"
顺便说一句,前面提到的cd "${TEST//\\/}"
命令执行的字符串与这里提到的完全相同。