Bash 中包含引号和空格的变量

Bash 中包含引号和空格的变量

我正在 Bash 脚本中尝试以下操作:

MV_PARAMS='"foo 1" "foo 2"'
mv $MV_PARAMS

我想要实际执行的是:

mv "foo 1" "foo 2"

但这似乎不起作用。尝试这个:

mv "$MV_PARAMS"

也不行。

答案1

你应该做的是使用数组:

mv_params=("foo 1" "foo 2")
mv "${mv_params[@]}"

数组扩展将正确处理带有空格或特殊字符的数组元素。

答案2

在 shell 脚本中处理文件名中的空格通常很复杂。在这种情况下,给出:

MV_PARAMS='"foo 1" "foo 2"'

当你写:

mv $MV_PARAMS

最终 shell 会mv像这样运行:

execve("/usr/bin/mv", ["mv", "\"foo", "1\"", "\"foo", "2\""])

也就是说,有四个参数:

  • “富
  • 1"
  • “富
  • 2英寸

您可以使用以下eval命令让 shell 解析生成的命令行:

eval "mv $MV_PARAMS"

这会做你想做的事。使用eval有时可能很棘手,在eval似乎是解决方案的情况下,我经常会尝试重写一些东西以避免需要它。

相关内容