我正在使用 cURL 提交到我的网站。我让 cURL 及时发布它。
在下面的代码中;第一行是curl提交;第二行用于排队:
curl -b cookies.txt \
-d title="$(sed '1,/sblmtitle/d;/slpstitle/,$d' sedut.html)" \
-d taxonomy%5Btags%5D%5B1%5D="$(
sed '1,/sblmkategori/d;/slpskategori/,$d' sedut.html
)" \
-d teaser_include=1 \
-d body="$(sed '1,/sblmkonten/d;/slpskonten/,$d' sedut.html)" \
-d field_source%5B0%5D%5Burl%5D="$(
sed '1,/sblmurl/d;/slpsurl/,$d' sedut.html
)" \
-d changed= \
-d form_build_id=form-424f851ad50bd4781c8c25ab7efd5c4c \
-d form_token=0e7cc7437faf816f1ecd96087286bda9 \
-d form_id=post_node_form \
-d op=Save http://www.web.org/submit/post &&
for file in $(ls *.html | sort -r | tail -1); do
mv $file sedut.html
done
如果cURL提交失败,会打印出sedut.html
内容。如果 cURL 提交成功,它不会打印任何内容。在我的例子中,有时 cURL 提交失败。
我想要的是如果第一行失败就不要执行第二行。但使用&&
上面的代码是行不通的。我测试过,cURL提交失败并打印出sedut.html
内容,但第二行仍然执行。
答案1
curl
不知道它失败了 - 它有明确定义的输入,它与服务器通信并返回响应200 OK
。因此,您不能依赖退出代码curl
(确实如此&&
)的退出代码。
相反,我们必须使用其他东西来确定成功或失败,例如由curl
.
ls
附带说明一下,在脚本中使用通常不是一个好主意。在这里,如果文件碰巧有换行符或空格字符,则会失败。这可能不太可能,但是有可能。看http://mywiki.wooledge.org/ParsingLs更多细节。根据经验,我仅ls
在为人眼显示结果时在脚本中使用。如果我以任何方式处理结果,我会使用find . -0 ...
答案2
&&
和||
(作为成功/失败测试)必须与要执行的命令位于同一逻辑行。使用续行 && \
和/或大括号{ }
笔记:正如所指出的安菲塔机器,行延续问题不适用于现代 sh 兼容 shell
true && echo "true"
true && \
echo "true"
true && \
{ echo "true"; echo "===="; }
(( 123 == 123 )) && {
echo "true"
echo "===="
}