Bash 包含转义空格的grep路径

Bash 包含转义空格的grep路径,bash,grep,escaping,Bash,Grep,Escaping,我尽了最大努力确保这不是重复的,并在这里找到了许多类似的主题,但似乎没有一个真正解决我的问题: 在bash脚本中,我尝试使用 path="$HOME/dir\ with\ spaces" grep pattern "$path/file" 这将返回: grep: /home/user/dir\ with\ spaces/file: No such file or directory 为什么呢? 当我在终端中尝试相同的方法时,只要我使用不带引号的路径,它就可以正常工作。但一旦我使用引号

我尽了最大努力确保这不是重复的,并在这里找到了许多类似的主题,但似乎没有一个真正解决我的问题:

在bash脚本中,我尝试使用

path="$HOME/dir\ with\ spaces"    
grep pattern "$path/file"
这将返回:

grep: /home/user/dir\ with\ spaces/file: No such file or directory
为什么呢? 当我在终端中尝试相同的方法时,只要我使用不带引号的路径,它就可以正常工作。但一旦我使用引号,我就会得到同样的错误。当然,在脚本中我需要引号,否则转义不起作用。
我做错了什么?

如果这样写,字符串中将包含
\

然后,当您使用
$path
作为文件名时,shell将查找名称中包含
\
的文件,而不仅仅是空格

这样写:

path="$HOME/dir with spaces"
或者:

path=$HOME/dir\ with\ spaces
换句话说,可以通过两种方式转义路径名中的空格:

  • 使用
    \
    逐个跳出空格
  • 将整个字符串括在双引号或单引号内

如果您这样写,
\
将包含在字符串中:

然后,当您使用
$path
作为文件名时,shell将查找名称中包含
\
的文件,而不仅仅是空格

这样写:

path="$HOME/dir with spaces"
或者:

path=$HOME/dir\ with\ spaces
换句话说,可以通过两种方式转义路径名中的空格:

  • 使用
    \
    逐个跳出空格
  • 将整个字符串括在双引号或单引号内