带有单引号和双引号的 bash 别名命令

Posted

技术标签:

【中文标题】带有单引号和双引号的 bash 别名命令【英文标题】:bash alias command with both single and double quotes 【发布时间】:2013-12-05 08:07:09 【问题描述】:

我有这个命令可以执行我想要的操作,但我无法在我的 .bashrc 中为其添加别名(请注意,它同时使用单引号和双引号):

svn status | awk '$1 =="M"print $2;'

我试过了:

alias xx="svn status | awk '$1 ==\"M\"print $2;'"

还有其他一些没有运气的常识组合..我知道 bash 对引号非常挑剔.. 那么别名的正确方法是什么,为什么?谢谢

【问题讨论】:

【参考方案1】:

你只需要正确地转义它。

alias xxx="svn status | awk '\$1 ==\"M\"print \$2;'"

【讨论】:

所以我没有逃避 $.. 不知道! 不错!我也不知道我必须逃避“$”! 很好的答案,但也提醒人们犯错是多么容易。在我处理的情况下,已经有转义字符,这造成了巨大的混乱。 EJK 下面的回答对我来说更有用,一个函数对许多人来说可能是一个更干净的选择:) @jeremyclarke 我不同意,逃避很难,如果可以的话,避免它。 `是否需要转义?【参考方案2】:

这里有一个不使用别名就能完成同样事情的东西。将其放入 .bashrc 中的函数中:

xx() 
    svn status | awk '$1 =="M"print $2;'

这样您就不必担心引号是否正确。这使用与命令行完全相同的语法。

【讨论】:

+1,但有一个小问题——function 关键字与 POSIX 不必要地不兼容。别管它:xx() ... 这个比较简单,我喜欢,但是另一个更准确地回答了这个问题.. @pragmatic_programmer 这是一个公平的解释。就个人而言,我仍然认为这个答案是更好的答案,尽管在字面意义上没有响应——至少有 50% 的时间我们在 irc.freenode.org 的#bash 中收到关于别名的问题,答案是“使用代替功能";别名只能做前缀扩展,例如,如果您想在参数上进行分支,这将无用。 有时候,对确切问题的字面答案更受欢迎,但大多数时候,像这样的答案更有帮助,因为它 1) 以简单的方式解决了最初的问题理解方式和 2) 为提问者提供了一个新工具,用于他们众所周知的工具带。 我必须同意,这比尝试使用别名要好得多【参考方案3】:

由于Bash 2.04,除了使用函数或转义the way @ffledgling 之外,还有第三种(更简单的)方法:使用字符串文字语法(here is an excellent answer)。

因此,例如,如果您想创建 this onliner 的别名,它最终会是:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"print $1" --revision "$3\' | xargs -rn3 snap remove'

所以你只需要在字符串前面添加$ 并转义单引号。

这会带来a shellcheck warning,您可能可以安全地禁用with # shellcheck disable=SC2139

【讨论】:

【参考方案4】:

您可以还原双引号和单引号,以便双引号在单引号之外

例如,这不起作用:

alias docker-table='docker ps --format "table .ID\t.Image\t.Status"'

但这有效:

alias docker-table="docker ps --format 'table .ID\t.Image\t.Status'"

当您检查实际解释的别名时,您可以看到内部引号实际上被转义了。

$ alias docker-table
alias docker-table='docker ps --format '\''table .ID\t.Image\t.Status'\'''

【讨论】:

以上是关于带有单引号和双引号的 bash 别名命令的主要内容,如果未能解决你的问题,请参考以下文章

linux bash shell中,单引号 双引号,反引号(``)的区别及各种括号的区别

bash:通过grep匹配单引号和双引号

linux中双引号单引号和不加引号的区别吗

在osx bash中转义多层级联单引号和双引号

linux bash shell 中的单引号和双引号

Shell 中单引号和双引号区别