代码之家  ›  专栏  ›  技术社区  ›  benw

shellscript中的backticks有问题

  •  8
  • benw  · 技术社区  · 15 年前

    我的shellscript使用backticks时遇到问题。以下是我遇到问题的脚本的示例版本:

    #!/bin/sh
    
    ECHO_TEXT="Echo this"
    ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'"
    
    result=`${ECHO_CMD}`;
    echo $result;
    
    result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`;
    echo $result;
    

    此脚本的输出为:

    sh-3.2$ ./test.sh 
    Echo this | awk -F' ' '{print $1}'
    Echo
    

    为什么第一个倒勾使用的是命令变量,而不是实际执行完整的命令,而是只返回第一个命令的输出和第二个命令?为了得到执行命令的第一个反勾号,我缺少了一些东西?

    4 回复  |  直到 15 年前
        1
  •  13
  •   codaddict    15 年前

    你需要使用 eval 让它运转起来

    result=`eval ${ECHO_CMD}`;
    

    代替

    result=`${ECHO_CMD}`;
    

    没有 埃瓦

    ${ECHO_TEXT} | awk -F' ' '{print \$1}
    

    将扩展到

    Echo this | awk -F' ' '{print \$1}
    

    将被视为 echo 并将逐字输出。用 埃瓦 那条线实际上是 运行 .

        2
  •  2
  •   Gilles Quénot ticktalk    15 年前

    你好,

    你需要知道 埃瓦 命令。

    见:

    #!/bin/sh
    
    ECHO_TEXT="Echo this"
    ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'"
    
    result="`eval ${ECHO_CMD}`"
    echo "$result"
    
    result="`echo ${ECHO_TEXT} | awk -F' ' '{print $1}'`"
    echo "$result"
    

    看医生:

    help eval
    
        3
  •  0
  •   verisimilidude    15 年前

    在第一个示例中,echo分析参数——shell从未看到它们。在第二个示例中,它工作是因为shell正在进行解析,并且知道如何处理管道。如果您将echo命令更改为“bash echo…”,它将起作用。

        4
  •  0
  •   krico    15 年前

    巴什在逃避你的命令。尝试

    ECHO_TEXT="Echo this"
    ECHO_CMD='echo ${ECHO_TEXT} | awk -F" " "'"{print \$1}"'"'
    
    result=`${ECHO_CMD}`;
    echo $result;
    
    result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`;
    echo $result;
    

    或者更好的是,在第一行尝试set-x,这样你就可以看到bash在做什么了。

    推荐文章