Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';t在bash中[sudo docker ps |…]的语法是否有效?_Bash - Fatal编程技术网

为什么不是';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 ...