Shell Scripting:Echo vs save to variable

时间:2014-08-28 18:16:41

标签: shell

为什么这些做不同的事情?

ENTRY="banana#Apple"

HOST_ID=$ENTRY | awk -F '#' '{print $2}'
echo $HOST_ID

echo $ENTRY | awk -F '#' '{print $2}'

在echo命令中,数据按预期显示。在save to variable命令中,数据不是,变量是空的。

1 个答案:

答案 0 :(得分:2)

此:

HOST_ID=$ENTRY | awk -F '#' '{print $2}'

意味着:

HOST_ID='banana#Apple' | awk -F '#' '{print $2}'

换句话说,您在单独的子shell中运行了两个命令 - HOST_ID='banana#Apple'awk -F '#' '{print $2}' - 并将一个输出汇总到另一个。这并没有完成任何事情:HOST_ID='banana#Apple'不产生任何输出,因此awk命令没有输入,因此它不会打印任何内容。 (并且由于子shell,即使HOST_ID='banana#Apple'部分也没有效果:它在子shell中设置该变量,而不是在运行整个命令的父shell中设置。所以值几乎立即消失了)


相反,你想写:

HOST_ID="$(echo "$ENTRY" | awk -F '#' '{print $2}')

或:

HOST_ID="$(awk -F '#' '{print $2}' <<< "$ENTRY")

或者(如果您只是期望$ENTRY有两个字段):

HOST_ID="${ENTRY#*#}"