【问题标题】:Preserving escape characters in bash function在 bash 函数中保留转义字符
【发布时间】:2014-12-14 19:35:24
【问题描述】:

我在尝试编写一个将文件移动到指定文件夹的简单 bash 函数时遇到了麻烦。我写的代码如下:

mv_file() {
  DESTINATION_FOLDER="~/Whatever"
  mv $1 $DESTINATION_FOLDER
}

但问题是 $1 经常包含转义字符,例如 ~/\[Bracketed\]File,当传递给 $1 时不再包含 \ 字符并最终寻找 ~/[Bracketed]File 这不是一个有效的文件/小路。我已经完成了关于这个主题的其他问题,但我认为解决方案与这个问题无关。有什么建议吗?

【问题讨论】:

  • 不会引用变量对此有帮助吗? mv "$1" $DESTINATION_FOLDER
  • 不,不幸的是,当我引用它时,正斜杠仍然不存在。例如当我echo "$1" 我得到~/[Bracketed]File :(
  • 那么我猜你需要 pass 到引号中的命令行参数。例如。 yourscript.sh "~/\[Bracketed\]File".
  • 嗯,我明白了,但这会以自动填充为代价,这会很麻烦。我可以自动填充,然后用引号括起来,但没有更好的方法吗?
  • 我真的不明白你关于自动填充的观点。这个脚本是否以某种方式自动化?源文件夹参数是用户提供的值吗?

标签: bash escaping special-characters argument-passing


【解决方案1】:

似乎需要进行两项更改。首先,您可能想要替换:

DESTINATION_FOLDER="~/Whatever"

与:

DESTINATION_FOLDER=~/"Whatever"

shell 只做波浪号扩展是波浪号是unquoted

其次,如果脚本的第一个参数被正确引用(从问题中不清楚),那么您需要替换:

mv $1 $DESTINATION_FOLDER

与:

mv "$1" "$DESTINATION_FOLDER"

【讨论】:

  • 感谢波浪号的提示,不知道 :)。不幸的是,当我将$1 括在引号中时,它不会改变正斜杠的消失。例如当我echo "$1" 我仍然得到~/[Bracketed]File
  • @aMat 您能否澄清括号中的路径的问题。你写“~/[Bracketed]File 这不是一个有效的文件/路径”。在您的文件系统上,有效路径是什么?另外,这可能是另一个波浪号内引号问题吗?
  • 是的。所以我会通过编写mv_file ~/\[Bracketed\]File 来调用该函数,然后它会吐出以下错误mv: rename /Users/aMat/[Bracketed]File to ~/Whatever: No such file or directory。我怀疑问题是我需要 mv 调用的转义字符。
  • 更新!对不起,混乱的人,但你在这两个方面都是绝对正确的!我的问题是我没有开始新的 bash 会话,所以我没有注册任何更改。再次感谢伙计,解决这个问题需要两个技巧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多