我有一个 bash 脚本,它将:
- 调用一个名为 get-server-status.py 的 python 脚本
- 将这些结果通过管道传输到 awk 命令中,该命令将从此输出中获取 commit-sha
- 将最终结果放入名为“SERVERS”的变量中
我的 bash 脚本调用的 python 脚本返回以下内容:
2017-09-13 14:09:15 INFO: About to query Instance:i-01010abcde54345a4
i-01010abcde54345a4 - 10.0.1.216: commit-sha = 0123456789
我希望仅获取“commit-sha”之后的字符,因此我使用以下代码将其导入 awk:
GET_SERVER_STATUS="./get-server-status.py --field=commit-sha -a"
$GET_SERVER_STATUS $SERVER_ASG_NAME | awk -F "commit-sha = " '{ print $2 }
这将返回我想要的内容:
0123456789
类似地,如果我的 python 脚本找到两台服务器并查询两个实例……:
2017-09-13 14:09:15 INFO: About to query Instance:i-01010abcde54345a4
i-01010abcde54345a4 - 10.0.1.216: commit-sha = 0123456789
2017-09-13 14:09:15 INFO: About to query Instance:i-03949eifje34543g3
i-03949eifje34543g3 - 10.0.2.246: commit-sha = 0123456789
我得到了两个提交 sha。正如我所希望的那样:
0123456789
0123456789
但这就是问题所在。如果我尝试将这些结果放入变量中,即:
SERVERS=(`$GET_SERVER_STATUS $SERVER_ASG_NAME | awk -F "commit-sha = " '{ print $2 }'`)
它只会返回一个值而不是两个。
0123456789
这里发生了什么? awk 的第一个返回值放在变量中会被覆盖吗?
答案1
使用 Bash 的现代进程替换语法$( ... )
或仅带有反引号的旧进程替换` ... `
:
SERVERS=$( $COMMAND $ARGUMENTS | awk -F "commit-sha = " '{ print $2 }' )
您编写的(` ... `)
代码运行反引号内的代码,然后根据其单词创建一个列表/数组(这就是括号的作用)。如果您尝试像读取普通变量一样读取数组变量,则只会返回第一个数组元素。要获取其他元素,您必须指定索引。
$ text=(few words in here)
$ echo $text
few
$ echo ${text[1]}
words
我还想说,在这个用例中,grep
使用后视可能是一种更直接的解决方案,尽管您的尝试似乎awk
也是正确的。我想这主要是个人喜好问题,但我会这样写:
SERVERS=$( $COMMAND $ARGUMENTS | grep -Po '(?<=commit-sha = )\w+' )
注意:我用更短的变量名替换了原来的变量名,以便命令可以很好地放在一行中。