【问题标题】:Bash script issueBash 脚本问题
【发布时间】:2011-03-18 17:14:04
【问题描述】:

我可以很好地运行这个命令,得到我想要的输出:

ifconfig eth0 | grep HWaddr | awk '{print $5}'

但是,当我将命令设置为变量并打印变量时,出现错误:

CASS_INTERNAL=`ifconfig eth0 | grep HWaddr | awk '{print \$5}'`
$CASS_INTERNAL

my internal xxx ip: command not found

奇怪的是——我的内部 IP 居然出现了。我该如何解决这个问题而不会出错?没关系,但我使用的是最新版本的 Ubuntu。

【问题讨论】:

  • 在命令周围使用反引号(即`)实际上会执行它。因此,您在第一行执行命令并将结果存储在 CASS_INTERNAL 中。正如 Wikken 所说,您只需使用“echo”返回结果。另一种方法是将命令文本存储在 CASS_INTERNAL 中(使用双引号 - 不是反引号)并仅使用 $CASS_INTERNAL 执行它。在您的示例中,您在第一行使用反引号执行它,然后在第二行使用 $CASS_INTERNAL 再次执行它。

标签: bash scripting awk ifconfig


【解决方案1】:

您不是在打印变量,而是将其作为命令名称运行。你在寻找

echo "$CASS_INTERNAL"

(养成总是在变量替换周围加上双引号的习惯。)

更高级的shell注意:在这种情况下没关系,但一般echo可能会遇到一些特殊字符(-\\),所以最好使用以下更复杂但完全可靠的命令:

printf "%s\n" "$CASS_INTERNAL"

【讨论】:

    【解决方案2】:

    不必使用grep

    ifconfig eth0 | awk '/HWaddr/{print $5}'
    

    【讨论】:

      【解决方案3】:
      CASS_INTERNAL=`ifconfig eth0 | grep HWaddr | awk '{print \$5}'`
      echo $CASS_INTERNAL
      

      你的:

      $CASS_INTERNAL
      

      会尝试将其作为命令运行。

      【讨论】:

      • +1 完全正确:正确,我想运行该命令,而不是打印它。
      【解决方案4】:

      你可能想要

      echo $CASS_INTERNAL
      

      【讨论】:

        【解决方案5】:

        好吧,你先用 grep 搜索 HWaddr,所以这一行的第五个字段是相关网络适配器的 MAC 地址,而不是你的本地 IP 地址。

        其他人建议解决方案是简单地回显结果,这意味着如果此示例中的 eth0 在执行该行的时间点不可用,它将无法工作。

        据我了解,您希望将所需的命令行放入变量中,然后稍后评估 it。这种模式通常称为惰性求值,通过使用 eval 内置函数 possible in bash

        #put the desired command in variable
        CASS_INTERNAL='ifconfig eth0 | grep HWaddr | awk "{print \$5}"'
        
        # ....
        
        #at later on - evaluate its contents!
        eval $CASS_INTERNAL
        11:22:33:aa:bb:cc
        

        【讨论】: