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

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

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

#!/bin/bash
read -e -p "Enter a Directory: " directory
echo $directory

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

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A Directory/

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

$ ./test.sh 
Enter a Directory: ~/A\ Directory/
/Users/<username>/A\ Directory/

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

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

答案1

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

read -e -p "Enter a Directory: " directory
ls -- "$directory"
cd -- "$directory"

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

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

echo "${directory// /\\ }"

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

quoted_directory=$(printf %s "$directory" | sed 's/[\\ '$'\t'']/\\&/')

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

read -e -p "Enter a Directory: " directory
if [[ $directory = \~/* ]]; then
  directory="$HOME/${directory#*/}"
fi
ls -- "$directory"
cd -- "$directory"

答案2

https://askubuntu.com/a/344418,

因此清除 IFS 变量:

   IFS=$'\n'       # make newlines the only separator

然后继续你的脚本。

答案3

你可以这样尝试:

例1:你的答案。

#!/bin/bash
read -e -p "Enter a Directory: " directory
new_directory="$(echo $directory | sed 's/ /\\ /g')"
echo $new_directory

示例 2:如果要cd编写脚本输出,请用双引号将其括起来。

#!/bin/bash
read -e -p "Enter a Directory: " directory
new_directory=\"$directory\"
echo $new_directory

相关内容