【问题标题】:Echoing a tilde to a file without expanding it in Bash在 Bash 中将波浪号回显到文件而不扩展它
【发布时间】:2012-08-27 18:46:42
【问题描述】:

我需要在 Bash 脚本中向文件写入参数,所以我正在做这样的事情,

echo "Argument is: $1" >> file

问题是,如果参数中有波浪号 (~),我不希望它扩展到主目录。因此,如果用户将 ~/bin 作为参数传递给脚本,它将被写为 ~/bin 而不是 /home/user/bin。我该怎么做?

【问题讨论】:

  • 用户需要传递引用的("") 参数或者需要转义\~
  • @PrinceJohnWesley 我不想将其作为用户要求。
  • 我不确定你能否解决这个问题(外壳总是会展开,除非用户引用参数)。我认为提示用户输入是你唯一的希望。我最近遇到了这个问题,所以你不是唯一一个被这个“功能”咬伤的人。
  • 如果用户输入your-script ~/foo,那么~会被用户的shell扩展。 your-script 根本无法知道用户输入了波浪号;它所看到的所有参数都是"/home/theuser/foo"。任何 bash 用户都需要注意这种行为。既然~表示用户的主目录,那你为什么不展开呢?

标签: bash escaping tilde


【解决方案1】:

您可以使用read 命令接受用户输入。

read var
echo "$var"

【讨论】:

    【解决方案2】:

    我假设你的程序是这样启动的:

    $ your_prog ~/foo
    

    参数在你的程序启动之前就被翻译了,所以除了教育用户在不需要扩展时适当地引用之外,你无法阻止它:

    $ your_prog "~/foo"
    

    【讨论】:

      【解决方案3】:

      Charles Duffy 有正确答案。您的程序的行为完全符合预期。试试这些:

      $ echo The HOME directory is ~
      $ echo "The HOME directory is ~"
      

      您会看到,仅将波浪号放在引号中就可以防止扩展。

      尽管您引用了引号,但您看不到波浪号的原因是外壳在您的程序甚至将波浪号作为参数获取之前就扩展了波浪号。

      Unix 中的 shell 本身就是一个非常强大的生物。它处理变量和特殊字符的扩展,例如~*,因此您的程序不必这样做。

      正如一位老教授曾经告诉我的那样,“这很好,除非它不是”。在这种特殊情况下,“不是”。 Unix shell 阻止你看到你想要的。

      解决这个问题的唯一方法是摆脱外壳。您可以使用read 语句来做到这一点。

      【讨论】:

        猜你喜欢
        • 2011-06-06
        • 2013-03-29
        • 2015-04-28
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 2011-08-10
        相关资源
        最近更新 更多