如何在bash脚本中检查程序的输出?

如何在bash脚本中检查程序的输出?,bash,scripting,Bash,Scripting,我有一个简单的脚本 wget -O file.zip www.site.com/asdqwdkjhasd.zip unzip file.zip 我称之为剧本 ./script.sh 现在我的问题是,如果zip文件已损坏,那么它将输出 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part ar

我有一个简单的脚本

wget -O file.zip www.site.com/asdqwdkjhasd.zip
unzip file.zip
我称之为剧本

./script.sh
现在我的问题是,如果zip文件已损坏,那么它将输出

  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
如何在脚本中检测此文本?如果程序的输出包含未找到中心目录签名结尾的字符串。然后做点什么

有时下载的zip文件已损坏,因此必须重新下载。如何检查输出是否为未找到中心目录签名的结尾。如果是这样,则重新下载,即执行wget并再次解压缩。换句话说,如何循环直到下载和提取成功

如何在bash脚本中实现这一点

谢谢你的帮助!谢谢

更新:


对不起,我对这个问题做了一点小改动。这就是我试图解决的实际问题。谢谢你的反馈

这是可能的,但你通常不会

您可以选择最后一个命令的退出代码,0是0错误,每隔一个值表示某种类型的错误,特定于应用程序的错误或只是一般错误。美元?您从最后一个命令中获得退出代码,但必须在有问题的命令之后立即使用它

((3 < 1)) ; err=$?; echo $err
1
((3 > 1)) ; err=$?; echo $err
0
比较词语可能会失败,而且本质上是不安全的。即使将命令设置为特定的设置,也不能阻止更新更改措辞,而且用户肯定是出于某种原因将其语言环境设置为不同的值


但是,2>&1会将错误流重定向到输出,这是屏幕的默认值,但在捕获时,会产生不同。只要您只是为自己编写脚本,在特殊情况下,这些方法可能会很有用,它们不会随着多个用户而扩展,也不会随着时间的推移而维护

如果解压写得很好,错误将反映在退出状态中,而不仅仅是输出。因此,您可以使用if解压$1;然后echo解压成功;否则echo解压失败;fi,这是最佳实践方法。检查特定字符串是脆弱的:如果程序的未来版本更改消息的文本,如果用户使用不同的语言/区域设置,从而使用不同的翻译表,则检查可能会失败;等等……如果您不仅要检查失败,还要检查特定的失败,请鼓励程序作者对该失败使用不同的退出状态。请参阅man rsync,以了解这方面做得很好的示例-每个主要故障模式都有一个明确的、有充分证明的退出状态。@CharlesDuffy:为什么不在回答中回答,但作为一个注释?但是-关于重复:命令的输出与错误消息不同。@userunknown,我在这里标记了两个重复项:一个用于比较stdout,因为这是OP字面上要求的,另一个用于比较stderr,因为OP实际需要它。在他们之间,我相信我们已经涵盖了所有内容。@userunknown,…而且,你和我一样清楚我为什么不添加答案:这是重复的,添加答案将违反中所述的网站规则-特别是“回答好问题”一节,特别是关于之前已经被多次询问和回答的问题的要点。a&&b||c是一种反模式,因为它不仅根据a的退出状态,而且还根据b的退出状态来更改c是否运行。最好的做法是教人们把它写出来:如果有;然后b;其他c;菲。这是。好的,“找到回声文件”怎么会失败?在这种情况下,您的if块会产生什么?另外,echo$erg,而不是echo$erg-如果没有引号字符串拆分和glob扩展,那么如果是ls'*'2>&1,我们捕获了一个错误,那么无引号的echo$erg将用一个文件名列表替换它*。这是。如果文件句柄关闭,或者由于连接的标准输出出现问题而导致写入失败,则回显可能会失败。I/O故障是存在的。不过,更重要的是,如果你教授一种实践,人们可能会认为更广泛地利用这种实践是安全的,除非教授的明确警告仅适用于X/Y/Z条件。抱歉,更新。我已经稍微改变了这个问题。这正是我试图解决的问题。
erg=$(LC_ALL=C ls nosuchsamplefile 2>&1)
echo "$erg"
ls: cannot access 'nosuchsamplefile': No such file or directory

erg=$(ls nosuchsamplefile 2>&1)
echo $erg
ls: Zugriff auf 'nosuchsamplefile' nicht möglich: Datei oder Verzeichnis nicht gefunden