Shell脚本:Echo vs save to variable

Shell脚本:Echo vs save to variable,shell,Shell,为什么它们做不同的事情 ENTRY="banana#Apple" HOST_ID=$ENTRY | awk -F '#' '{print $2}' echo $HOST_ID echo $ENTRY | awk -F '#' '{print $2}' 在echo命令中,数据按预期显示。在save to variable(保存到变量)命令中,数据为空,变量为空。这是: HOST_ID=$ENTRY | awk -F '#' '{print $2}' 这意味着: HOST_ID='banan

为什么它们做不同的事情

ENTRY="banana#Apple"

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

echo $ENTRY | awk -F '#' '{print $2}'
在echo命令中,数据按预期显示。在save to variable(保存到变量)命令中,数据为空,变量为空。

这是:

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\u ID='banana#Apple'
不产生任何输出,因此
awk
命令不获取任何输入,因此它不打印任何内容。(由于子shell,即使是
HOST_ID='banana#Apple'
部分也没有效果:它在子shell中设置该变量,而不是在运行全局命令的父shell中。因此该值几乎立即消失)


相反,您要写:

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


您需要告诉shell您的
HOST\u ID=…
版本打算执行一个命令。仅仅在上面放一些看起来像命令的文本是不够的
var=$(这里的command)
var=`command here`
顺便说一句,如果您提到您正在使用的shell,那么它会很有帮助,尽管这里的答案中的技术往往适用于bourne类型的shell:
bash
sh
zsh
dash
HOST_ID="$(awk -F '#' '{print $2}' <<< "$ENTRY")
HOST_ID="${ENTRY#*#}"