【问题标题】:Problem with backticks in shellscriptshell脚本中的反引号问题
【发布时间】:2011-04-25 00:47:04
【问题描述】:

我在使用反引号使我的 shellscript 工作时遇到问题。这是我遇到问题的脚本的示例版本:

#!/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

为什么使用变量的命令的第一个反引号实际上并没有执行完整的命令,而是只返回第一个命令的输出和第二个命令?为了让第一个反引号执行命令,我遗漏了一些东西?

【问题讨论】:

  • 反引号已经过时了,不应该再使用了——改用$()会省去很多麻烦
  • 请参阅BashFAQ/050(不要将命令放在变量中)和BashFAQ/048(避免使用eval)。此外,您的 shebang 说“#!/bin/sh”,提示说“sh”,但您的问题标签说 [bash],这不是一回事。
  • 我没有设置 bash 标签,其他用户在我发布后更改了它。
  • POSIX sh 支持$()。没有任何借口。

标签: shell backticks


【解决方案1】:

在您的第一个示例中, echo 正在解析参数 - shell 永远不会看到它们。在第二个示例中,它可以工作,因为 shell 正在执行解析并且知道如何处理管道。如果您将 ECHO_CMD 更改为“bash echo ...”,它将起作用。

【讨论】:

    【解决方案2】:

    您需要使用eval 才能使其正常工作

    result=`eval ${ECHO_CMD}`;
    

    代替

    result=`${ECHO_CMD}`;
    

    没有eval

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

    将扩展为

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

    将被视为echo 的参数并将逐字输出。使用eval,该行实际上将运行

    【讨论】:

      【解决方案3】:

      Bash 正在为你逃避你的命令。试试

      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 在做什么

      【讨论】:

        【解决方案4】:

        你好,

        你需要知道eval命令。

        见:

        #!/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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多