Bash脚本问题

3
我可以顺利运行这个命令,并获得我想要的输出:
ifconfig eth0 | grep HWaddr | awk '{print $5}'

然而,当我将命令设置为变量并打印变量时,出现错误:
CASS_INTERNAL=`ifconfig eth0 | grep HWaddr | awk '{print \$5}'`
$CASS_INTERNAL

我的内部xxx IP: 找不到命令

奇怪的是 - 我的内部IP实际上显示出来了。我该如何避免出现错误呢?虽然这并不重要,但我正在使用最新版本的Ubuntu。


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

4
您没有打印变量,而是将其作为命令名称运行。您需要查找:
echo "$CASS_INTERNAL"

养成在变量替换周围始终使用双引号的习惯。

更高级的Shell提示:在这种情况下无所谓,但通常情况下,echo可能会遇到一些特殊字符(-\\),因此最好使用以下更复杂但完全可靠的命令:

printf "%s\n" "$CASS_INTERNAL"

4

不必使用 grep

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

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

Your:

$CASS_INTERNAL

尝试将其作为命令运行。

+1 确切的,我想运行那个命令,而不是打印它。 - user285594

1

你可能想要什么

echo $CASS_INTERNAL

0

好的,您首先使用grep查找HWaddr,因此该行的第五个字段是有问题的网络适配器的MAC地址,而不是您的本地IP地址。

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

据我所知,您希望将期望的命令行放入变量中,然后稍后对进行评估。这种模式通常称为延迟评估,并且通过使用eval内置函数在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接