【问题标题】:How to pass backslashes argument to a script?如何将反斜杠参数传递给脚本?
【发布时间】:2016-06-13 20:03:39
【问题描述】:

我只想在文本文件中附加一个用户输入参数。我正在使用以下命令:

echo "$2" >> "./db.txt"

$2 应该让用户设置如下路径:D:\Projects\MyProject。它写入文件,但没有反斜杠。结果是:

D:ProjectsMyProject

我找不到任何解决方法。我尝试过使用-e-E params(taken from here),但在这种情况下似乎没有什么不同。

【问题讨论】:

  • 难道$2 从不 包含那些反斜杠吗?你如何调用你的脚本?
  • echo 没有任何问题。发布完整代码。
  • @Biffen 它应该被称为./script.sh D:\Projects/MyProjects。这是强制性的,对此进行检查。
  • @DontVoteMeDown 那些反斜杠确实会消失。尝试引用命令行参数,例如./script.sh 'D:\Projects/MyProjects'.
  • @DontVoteMeDown,在 args 中单引号将避开那些反斜杠

标签: bash shell sh


【解决方案1】:

echo 'foo\bar\baz' 将显示foo\bar\baz

当您的参数完全不使用引号时,某些字符具有特殊含义,例如$ 表示$HOME 中的变量。空格是参数分隔符,所以如果你想将它作为一个参数传递,你也必须将其转义。

您可以使用strong quoting 不必引用反斜杠(例如'foo\bar')。在强引号字符串中,唯一具有特殊含义的字符是',这意味着如果要将其放入屏幕中,它是唯一必须转义的字符。

所以echo 'foo\bar\baz' 将显示foo\bar\baz

【讨论】:

  • 您不能在单引号字符串中包含单引号,即使它被转义。 echo 'foo\'' 是语法错误。
【解决方案2】:

您必须在 shell 中转义反斜杠:\\,或将字符串放在引号中。

出于调试目的,请使用set -x

【讨论】:

  • 有没有办法避免这种情况并在代码中解析? Imo 要求用户自己逃脱它并不好。
  • 嗯,我想引号就可以了。
  • @DontVoteMeDown 如果反斜杠没有在命令行中被引用或转义,它们将在参数传递给您的脚本之前被删除。一旦他们走了,就没有办法把他们放回去。因此,它们必须在命令行上被 euoted 或转义。
  • @GordonDavisson 谢谢你,我对你的 cmets 投了赞成票(反斜杠在参数传递给脚本之前被删除),但你能提供一些文档引用吗?我试图搜索权威来源但失败了。
猜你喜欢
  • 2020-10-19
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2011-08-01
相关资源
最近更新 更多