我正在编写一个脚本来下载一堆文件,我希望它在特定文件不存在时发出通知。
r=`wget -q www.someurl.com`
if [ $r -ne 0 ]
then echo "Not there"
else echo "OK"
fi
但是执行时出现以下错误:
./file: line 2: [: -ne: unary operator expected
怎么了?
其他人已正确发布您可以使用
$?
获取最新的退出代码:
wget_output=$(wget -q "$URL")
if [ $? -ne 0 ]; then
...
这可以让您捕获标准输出和退出代码。如果你实际上不在乎它打印什么,你可以直接测试它:
if wget -q "$URL"; then
...
如果你想抑制输出:
if wget -q "$URL" > /dev/null; then
...
$r
是 wget 的文本输出(您用反引号捕获)。要访问返回代码,请使用 $?
变量。
$r
为空,因此您的条件变为 if [ -ne 0 ]
并且看起来 -ne
被用作一元运算符。试试这个:
wget -q www.someurl.com
if [ $? -ne 0 ]
...
编辑 正如安德鲁在我之前解释的那样,反引号返回标准输出,而
$?
返回最后一个操作的退出代码。
你可以
wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure"
-(~)----------------------------------------------------------(07:30 Tue Apr 27)
risk@DockMaster [2024] --> wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure"
--2010-04-27 07:30:56-- http://ruffingthewitness.com/
Resolving ruffingthewitness.com... 69.56.251.239
Connecting to ruffingthewitness.com|69.56.251.239|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `index.html.1'
[ <=> ] 14,252 72.7K/s in 0.2s
2010-04-27 07:30:58 (72.7 KB/s) - `index.html.1' saved [14252]
WE GOT IT
-(~)-----------------------------------------------------------------------------------------------------------(07:30 Tue Apr 27)
risk@DockMaster [2025] --> wget ruffingthewitness.biz && echo "WE GOT IT" || echo "Failure"
--2010-04-27 07:31:05-- http://ruffingthewitness.biz/
Resolving ruffingthewitness.biz... failed: Name or service not known.
wget: unable to resolve host address `ruffingthewitness.biz'
zsh: exit 1 wget ruffingthewitness.biz
Failure
-(~)-----------------------------------------------------------------------------------------------------------(07:31 Tue Apr 27)
risk@DockMaster [2026] -->
从 wget 捕获结果并检查通话状态的最佳方法
wget -O filename URL
if [[ $? -ne 0 ]]; then
echo "wget failed"
exit 1;
fi
这样您可以检查 wget 的状态并存储输出数据。
如果调用成功,则使用存储的输出
否则会退出并报错 wget failed
我尝试了所有的解决方案,但没有运气。
wget 以非交互方式执行。这意味着 wget 在后台工作,你无法用 $? 捕获返回码。
一种解决方案是处理“--server-response”属性,搜索http 200状态代码 示例:
wget --server-response -q -o wgetOut http://www.someurl.com
sleep 5
_wgetHttpCode=`cat wgetOut | gawk '/HTTP/{ print $2 }'`
if [ "$_wgetHttpCode" != "200" ]; then
echo "[Error] `cat wgetOut`"
fi
注意:wget 需要一些时间来完成他的工作,因此我设置了“sleep 5”。这不是最好的方法,但可以很好地测试解决方案。
CURL 实用程序具有 --dump-header 选项,允许您将响应标头上传到单独的文件。
tmp=`mktemp -u`
curl --silent --dump-header "$tmp" -o ./retOut http://www.someurl.com`
sleep 5
_wgetHttpCode=`cat ${tmp} | gawk '/HTTP/{ print $2 }'`
if [ "$_wgetHttpCode" != "200" ]; then
cat "${tmp}"
fi
[ -e "$tmp" ] && rm "$tmp"