使用“&&”对于 cURL 提交表单无效(如果第一行失败,则不执行第二行)

使用“&&”对于 cURL 提交表单无效(如果第一行失败,则不执行第二行)

我正在使用 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 "====" 
}

相关内容