【发布时间】:2019-06-16 06:43:24
【问题描述】:
我有这个脚本,旨在将变量分配给收集有关系统信息的命令,然后将它们回显。这对于前几个命令非常有效,但最后一个命令会继续返回值,而不会从输出中删除“PRETTY_NAME=”。
这有什么我没有看到的问题吗?
我曾尝试使用 grep 来分隔 awk:
grep PRETTY_NAME /etc/*-release | awk -F '=' '{print $2}'
使用转义引号:
awk -F \"=\" '/PRETTY_NAME/ {print $2}' /etc/*-release
整个块(为了相关性而进行了一些编辑)
declare -A CMDS=(
[primaryMacAddress]="cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address"
[primaryIpAddress]="hostname --ip-address"
[hostname]="hostname"
[osType]="awk -F '=' '/PRETTY_NAME/ {print $2}' /etc/*-release"
)
#This bit is actually nested in another function
for kpair in "${!CMDS[@]}" do
echo "$kpair=\"$( eval ${CMDS[$kpair]} )\""
done
从 .sh 文件运行时的结果:
osType="PRETTY_NAME="Red Hat Enterprise Linux Server 7.4 (Maipo)""
预期:
osType=""Red Hat Enterprise Linux Server 7.4 (Maipo)""
当此命令自行运行时,它似乎按预期工作:
$ awk -F '=' '/PRETTY_NAME/ {print $2}' /etc/*-release
“红帽企业 Linux 服务器 7.4(迈坡)”
【问题讨论】:
-
$2在双引号内展开。请改用\$2。或者只是......使用函数,这太糟糕了:) -
@PesaThe 不幸的是,由于脚本其余部分的结构,这是我可以管理此部分的最佳方式,但这确实解决了我的问题。谢谢。
-
第一个条目应该有同样的问题,
$(ip route...)过早扩展。如果这确实是个问题。 -
@ncfx1099 在 shell 中,使用
eval几乎总是一个糟糕的选择。您可能想问另一个问题,在哪里解释“脚本其余部分的结构”以及为什么会导致您使用此代码。我希望人们能够为您提供更好的方法。