我有一个小的 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