为什么不是';t在bash中[sudo docker ps |…]的语法是否有效?
所以我正在努力学习为什么不是';t在bash中[sudo docker ps |…]的语法是否有效?,bash,Bash,所以我正在努力学习awk。我想做一个sudo docker ps,如果第二行第二列的第一个元素是x,那么它会打印ok #!/bin/bash if [ sudo docker ps | awk 'FNR == 2 {print $2}' = "portainer/agent" ] then echo "Sucess" else echo "Error" fi 问题: 这就是我们将命令解析为awk的方式吗?(docker ps|awk)? 输出显示未找到命令 我想我把bash
awk
。我想做一个sudo docker ps
,如果第二行第二列的第一个元素是x
,那么它会打印ok
#!/bin/bash
if [ sudo docker ps | awk 'FNR == 2 {print $2}' = "portainer/agent" ]
then
echo "Sucess"
else
echo "Error"
fi
问题:
这就是我们将命令解析为awk的方式吗?(docker ps|awk
)?
输出显示未找到命令
我想我把bash的一些基本原理搞砸了
或者我该怎么做
sudo docker ps
if [ awk 'FNR == " {print $2}' = "portainer" ]
then
echo "sucess"
else
echo "error"
没有说明指定
docker ps
输出的第2行是否明智(这是一个稳定的接口吗?),但您正在寻找的语法是(可能有很多选项!):
需要注意的几件事:不要为[
命令。相反,只需计算awk的返回状态。awk
返回!s
,因为shell中的成功由零状态指示;除非满足条件,否则变量s
的值为零,因此我们在返回shell之前将其反转。请注意“Error”已写入stderr。错误消息需要发送到正确的位置
另一种选择(我真的建议不要这样做,但很多人都是这样做的,所以了解语法很好)是检查awk的输出,如下所示:
if test "$(sudo docker ps | awk 'FNR == 2 && $2 == "portainer/agent" {print "ok"}
')" = ok; then ...
请注意,我使用的是test
而不是[
。它们是一样的,只是test
不要求它的最终参数是]
,我认为当读者不想去想[
是语法的一部分,是某种运算符。但这完全是一种文体选择。有些人会认为,你不应该使用[
或测试,而应该使用[[
(语法的一部分)。YMMV
在这里,请注意引号。无需引用原始字符串ok
,因为它不受分词的影响,尽管有许多样式指南(正确地)建议使用引号。为了强调下一点,我在这里不使用引号。需要引用流程替换的输出,因为如果awk未打印任何内容,您希望将空字符串作为参数传递给测试
。如果没有引号,则传递给测试
的第一个参数将是=
,这将产生错误。一般来说,双引号的目的是防止分词并定义空字符串。不过,这与您的问题并不特别相关,需要比这些注释更详细的处理。但是当您说x
,您指的是字符串portainer/agent
es!对不起,应该指定下面提到的Das William,假设您想要的是输出的第2行似乎是不明智的。为什么不在输出中搜索具有相关字符串的行,而不是指定行号呢?awk
可以使用其中任何一个…为此,我也会在这里进行测试并打印awk
,尽管如果您需要来自bash
的文件,您可以这样安排……请发布来自sudo docker ps
的两个示例输出,一个用于成功,一个用于错误。在我的情况下,docker ps的打印将始终是相同的,因为我在任何时候都只有一个容器在运行,我知道有更好的方法来完成它,但我仍然是这样做只是为了学习awk,而不是实际部署一些东西:)唯一不同的情况是容器没有运行,在这种情况下是“docker ps”只返回一条空的第二行谢谢!现在我明白了!很抱歉,我犯了经典错误,在谷歌上粘贴了文婷的东西,而不知道发生了什么。我会接受你的问题!只需要再等两分钟。再次,非常感谢。还有,是的,docker ps,打印了一份docker pro的漂亮列表塞斯在跑。
if test "$(sudo docker ps | awk 'FNR == 2 && $2 == "portainer/agent" {print "ok"}
')" = ok; then ...