如果条件不起作用,则简单Shell

时间:2014-01-29 19:40:12

标签: bash shell if-statement file-exists

if [ $? -ne 0 ]; then echo "error"; else echo "success"; fi

成功,

if [ ! -f index.html ]; then echo "error"; else echo "success"; fi

成功,但出于某种原因

if [ ! -f index.html ] || [ $? -ne 0 ]; then echo "error"; else echo "success"; fi

失败。

在我的情况下,“index.html”存在且$? = 0

3 个答案:

答案 0 :(得分:3)

if [ ! -f index.html ] || [ $? -ne 0 ]

$?的值反映了[ ! -f index.html ]的退出代码。由于存在index.html,因此该语句会导致非零退出代码。

尝试改为:

if [ $? -ne 0 ] || [ ! -f index.html ] ; then echo "error"; else echo "success"; fi

由于首先执行[ $? -ne 0 ]$?的值将反映先前命令的退出代码,而不是[ ! -f index.html ]的结果。

另一种可能性是将两个测试都放在一个条件表达式中:

if [ ! -f index.html -o  $? -ne 0 ]; then echo "error"; else echo "success"; fi

因为现在有一个测试表达式,所以bash会在$?测试运行之前评估! -f index.html。因此,$?将是先前命令的退出代码。

答案 1 :(得分:0)

请改为尝试:

if [[ ! -f index.html || $? -ne 0 ]]; then echo "error"; else echo "success"; fi

答案 2 :(得分:0)

您执行的每个命令都会更改$?。最好立即将其存储在一个新变量中,然后随意检查。