【问题标题】:How to escape quotes in bash?如何在bash中转义引号?
【发布时间】:2016-07-10 03:26:07
【问题描述】:

我试过这个:

    a="\"Google Chrome\""

我试过了

    a="'Google Chrome'"

但是不行。 我怎样才能完成? 对于这里的脚本:

birthBrowser(){
    local a
    if [ $# -eq 0 ]
    then
        a="Google Chrome"
    fi
    if [ $# -eq 1 ]
    then
        a="$1"
    fi
    if [ $# -gt 1 ]
    then
        a="$1"
        echo "Too many arguments"
    fi
    open -a $a
}

它似乎一直只阅读 Chrome 部分,而不是将“Google Chrome”作为一个论据。

例如 open -a "Google Chrome" 在控制台中工作。

【问题讨论】:

  • 这里已经回答了这个问题:stackoverflow.com/questions/35586627/…
  • 转义引号使它们成为数据,而不是语法。除非您真的希望引号被 open 命令视为数据(我向您保证,您不会这样做),否则您 不想 转义引号。相反,您应该逃避扩展。
  • @theman,它可以满足您的要求;这不是您想要的。它转义了引号,这就是您要问的方法,但是如果您希望 open 正常工作,那么这些引号不应转义。
  • 顺便说一句,如果您想自动检查此类错误,请参阅shellcheck.net

标签: string bash escaping


【解决方案1】:

如果您的预期行为与此相同:

open -a "Google Chrome"

...那么您的脚本使用应如下所示:

a="Google Chrome"
open -a "$a"

在上面的用法中,所有引号都是语法,而如果您将引号作为字符串的一部分进行字面转义,那么它们将成为数据,并失去其作为语法的特殊含义。

请参阅BashFAQ #50,了解为什么试图逃避语法引号是错误的。

【讨论】:

  • 这太违反直觉了,因为它与 1970 年代设计的东西向后兼容。欢迎来到 UNIX。
  • 伯恩。请注意,与 Bourne 不完全向后兼容 - 90 年代早期的 POSIX sh 标准取消了接受 ^ 作为管道字符 - 但有一组有限的例外。
  • 确实如此。 Bash 是 POSIX sh 的超集(主要是;默认情况下会破坏一些小部分,例如 echo 规范),Bourne 早于几十年。也就是说,这个名字被选为可爱,而不是准确
  • @theman, ...和“幼儿园”if/fi / case/esac 等东西也不是源自 Bourne —— 那是从更早的(1950 年代和 60 年代)借来的-era) 语言,ALGOL。如果倾向于带头辩论,我会争辩说“幼儿园”是不了解他们所在领域历史的人。 :)
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 2017-08-24
  • 2016-07-08
  • 2016-06-05
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多