bash 使用空格和反斜杠更改目录

bash 使用空格和反斜杠更改目录

我正在尝试构建一个脚本,我需要能够管理名称中是否带有空格和/或反斜杠的目录。

在 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//\\/}"命令执行的字符串与这里提到的完全相同。

相关内容