Bash:对包含空格的变量使用cd命令

Tom*_*ett 0 bash shell awk cd sed

我试图更改脚本中的目录,以便使用相对路径执行一系列操作.该文件夹是一个名为的变量$input_path:

cd $(echo "$input_path")
Run Code Online (Sandbox Code Playgroud)

如果变量中有空格,例如"/ home/user/test directory/subfolder",脚本将返回错误:

./test_currently_broken.sh:86行:cd:"/ home/user/test:没有这样的文件或目录

我尝试了各种方法来逃避空间:

# escape spaces using backslashes, using sed
input_path=$(echo "$input_path" | sed 's/ /\\ /g')
Run Code Online (Sandbox Code Playgroud)

要么

# wrap input path with awk to add quotes
input_path=$(echo "$input_path" | awk '{print "\"" $0 "\""}')
Run Code Online (Sandbox Code Playgroud)

要么

# wrap in single quotes using sed
input_path=$(echo "$input_path" | sed -e "s/\(.*\)/'\1'/")#
Run Code Online (Sandbox Code Playgroud)

但没有人修复错误 - 它仍然无法更改目录.我已经确认它尝试更改的目录肯定存在,并且cding在此脚本之外工作.

有这种奇怪行为的解决方案cd吗?

fed*_*qui 5

你为什么不......

cd "$input_path"
Run Code Online (Sandbox Code Playgroud)

因为引用,空格不会有任何问题.

通过说cd $(echo "$input_path")你实际上说cd my path,而你想做cd "my path".因此,正如下面JID所评论的那样,你也可以说,cd "$(echo $input_path)"因为重要的引号是"更接近"的引号cd.


如果你不引用,cd请看:

cd my path
Run Code Online (Sandbox Code Playgroud)

所以它试图cd my,而如果你引用它看到:

cd "my path"
Run Code Online (Sandbox Code Playgroud)

  • 或者如果由于某种原因想要使用子shell,请引用子shell"$(echo $ input_path)"` (2认同)