当从终端直接运行时,Bash Script不会为命令打印相同的输出

时间:2015-03-25 14:56:58

标签: linux bash shell awk

我正在尝试从脚本运行相同的awk命令但是我得到一个额外的错误我不确定它是否来自但是当我从终端运行命令它不会返回false?

get_state.sh

#/bin/bash

# sed -n '/\\State/{getline; print}' /var/opt/BESClient/besclient.config
export SERVER_STATE=`awk '/\\State/{getline; print $3}' /var/opt/BESClient/besclient.config`
echo $SERVER_STATE
echo $SERVER_STATE
exit 0

输出

./ get_state.sh

false Live
false Live

但是

sh-4.1$ awk '/\\State/{getline; print $3}' /var/opt/BESClient/besclient.config

输出

Live

2 个答案:

答案 0 :(得分:1)

需要在反引号中转义反斜杠,并且某些shell还需要$进行转义。要么这样做:

#                            vv-- here --------------v
export SERVER_STATE=`awk '/\\\\State/{getline; print \$3}' /var/opt/BESClient/besclient.config`

或者改为使用$()

export SERVER_STATE=$(awk '/\\State/{getline; print $3}' /var/opt/BESClient/besclient.config)

false来自包含State(但不是\State)的行之后的第三个字段,并且它们出现在一行而不是两行是因为<{1}}未加引号

$SERVER_STATE

答案 1 :(得分:0)

getline只应在少数情况下使用,而不是其中之一。在您的特定情况下,如果\State是文件的最后一行或getline以任何其他方式失败,那么您将打印THAT行的第3个字段而不是后续行,并且还有各种其他陷阱。有关详细信息,请参阅http://awk.info/?tip/getline

在awk中编写脚本并从shell调用它的方法是:

export SERVER_STATE=$(awk 'f{print $3;f=0} /\\State/{f=1}' /var/opt/BESClient/besclient.config)
echo "$SERVER_STATE"

请注意,似乎没有必要导出shell变量,如果是这种情况,那么它不应该是全大写的。虽然这个变量看起来根本没有必要,但是接下来你用它做什么...