如何将带有转义空间的目录传递给变量?

1 command-line bash terminal variable

我有一个小 test.sh 脚本,如下所示:

#!/bin/bash
read -e -p "Enter a Directory: " directory
echo $directory
Run Code Online (Sandbox Code Playgroud)

这是我运行时发生的情况:

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A Directory/
Run Code Online (Sandbox Code Playgroud)

我希望能够将转义空间保留在该变量内,以便程序输出为:

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A\ Directory/
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做吗?其用途是告诉脚本在哪里查找它需要读取的文件。

编辑:我忘记将 \ 放在第二个和第三个代码选择中。

Gil*_*il' 5

变量中没有要保留的转义空间。当您在提示符下输入时~/A Directory/,变量directory包含~/A Directory/. 如果您稍后在脚本中遇到此空格问题,那是因为您忘记了变量扩展周围的双引号

\n\n
read -e -p "Enter a Directory: " directory\nls -- "$directory"\ncd -- "$directory"\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果--值以 开头-,则不会将其视为选项。

\n\n

如果出于某种原因你想在空格前添加反斜杠,你可以使用bash 的字符串操作功能来完成。

\n\n
echo "${directory// /\\\\ }"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这不太可能有用。如果需要以再次解析的形式打印出目录,肯定还会有其他字符需要引用。哪些字符取决于要解析它的内容,但至少制表符(和换行符,但您的脚本无法读取它们)将需要引用(如果空格),并且还需要引用反斜杠。Bash 没有方便的方法来做到这一点。您可以使用 sed,但在将数据传递给它时要小心 \xe2\x80\x94\xc2\xa0echo不会打印所有未修改的参数。增加难度的命令替换会删除尾随换行符,但这里不会有换行符。

\n\n
quoted_directory=$(printf %s "$directory" | sed \'s/[\\\\ \'$\'\\t\'\']/\\\\&/\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请注意,这里没有任何内容在开头扩展波形符。(你显示的输出是伪造的,你太顽皮了!)波形符扩展仅作为源代码解析的一部分发生,当变量的值扩展时不会发生。如果您想用主目录替换初始波浪号,则需要手动执行此操作。

\n\n
read -e -p "Enter a Directory: " directory\nif [[ $directory = \\~/* ]]; then\n  directory="$HOME/${directory#*/}"\nfi\nls -- "$directory"\ncd -- "$directory"\n
Run Code Online (Sandbox Code Playgroud)\n