如果脚本匹配变量,报价问题,则为别名

时间:2013-09-26 05:25:45

标签: quotes double-quotes bash

我正在尝试编写一个alias的常用命令来取消一个进程,但我遇到单引号和双引号的问题。这是我第一次尝试使用Bash脚本,我有点难过。

lsof -i tcp:80 | awk '$1 == "Google" {print $2}'

这可以作为独立命令运行并输出正确的PID。

当我尝试将其格式化为别名时虽然我遇到了问题。我知道命令是按照这个结构的方式停在第一个单引号但是我不确定如何解决它。

alias test='lsof -i tcp:80 | awk '$1=="Google" {print $2}''

3 个答案:

答案 0 :(得分:2)

尝试像这样定义你的别名

alias test='lsof -i tcp:80 | awk '"'"'$1=="Google" {print $2}'"'"

单引号'必须在双引号"之间转义。为此,必须将命令拆分为多个部分以便以不同方式对其进行转义。 lsof -i tcp:80 | awk '$1=="Google" {print $2}'可以在单引号上拆分,例如

  1. lsof -i tcp:80 | awk
  2. '
  3. $1=="Google" {print $2}
  4. '
  5. 然后引用适当的引号

    1. 'lsof -i tcp:80 | awk'
    2. "'"
    3. '$1=="Google" {print $2}'
    4. "'"
    5. 将每个部分合并在一起,你就拥有了别名:

      'lsof -i tcp:80 | awk'"'"'$1=="Google" {print $2}'"'"
      

      请注意,第一部分不包含任何解释变量,因此可以使用双引号引用它并与第二部分合并。因此别名变为

      alias test="lsof -i tcp:80 | awk'"'$1=="Google" {print $2}'"'"
      

答案 1 :(得分:2)

单引号内的单引号没有转义序列。你不能像预期的那样写\'。所以有两种选择。

  1. 您可以打破单引号,添加转义单引号\',然后返回,如下所示:

    alias test='lsof -i tcp:80 | awk '\''$1 == "Google" {print $2}'\'
    
  2. 您可以使用双引号。然后你不仅要逃避字符串中的双引号,还要逃避美元符号。

    alias test="lsof -i tcp:80 | awk '\$1 == \"Google\" {print \$2}'"
    

答案 2 :(得分:0)

在几乎所有发现自己试图定义别名的情况下,都要定义一个函数。

testing () {
    lsof -i tcp:80 | awk '$1=="Google" {print $2}'
}