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

时间:2018-02-04 05:07:44

标签: 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 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脚本中实现这一点?

我感谢任何帮助!谢谢!

更新

对不起,我对这个问题做了一些改动。这是我试图解决的实际问题。感谢您的任何反馈!

1 个答案:

答案 0 :(得分:1)

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

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

((3 < 1)) ; err=$?; echo $err
1
((3 > 1)) ; err=$?; echo $err
0

错误消息通常取决于LOCALE设置:

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

比较单词可能会失败并且本质上是不安全的。即使将命令设置为特定设置也无法阻止更新更改措辞,当然,用户已将其Locale设置为某个不同的值。

然而,2&gt; &amp; 1将错误流重定向到输出,这是屏幕的默认值,但在捕获时,它会产生影响。只要您自己编写脚本并在临时情况下,方法就会很有用,这些方法无法与多个用户进行扩展,也无法在多年内进行维护。