为什么ksh脚本在while循环后退出代码1?

时间:2016-05-06 18:01:16

标签: ksh aix

我通常编写Perl脚本,但是我修改了一个传统的KSH脚本(所以我不必重写整个事情),它设置一个等于数组中项目数的计数器,然后执行while循环,递减计数器,以便我可以按特定顺序为变量赋值。但是,当我这样做时,退出代码是1,而不是0。

这里是代码():

set -A MY_ARRAY item1 item2
i=${#MY_ARRAY[@]}
while [[ ${i} -gt 0 ]]; do
    (( j = ${#MY_ARRAY[@]} ))
    if [[ ${i} -ge ${j} ]]; then
        x="first value"
    else
        x="second value"
    fi

    (( i = i - 1 ))
done

当上面的代码运行时,退出代码为1.我认为这是因为上一次尝试迭代期间的条件是[[ 0 -gt 0 ]]并且因为这个测试是假的,所以返回值是$?是1.但是,如果我写下以下内容,则退出代码为0:

i=0
if [[ ${i} -gt 0 ]]; then
    x="first value"
else
    x="second value"
fi

如果问题是因为最后一次迭代的条件为假,那么处理这个问题的最佳方法是什么?是否在“完成”之后立即设置返回值。线,像这样:

done || return 0

done || exit 0

或者在完成'之后在后续行设置退货/退货价值。线,像这样:

done
return 0

done
exit 0

否则,我错过了什么/做错了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

while循环将返回循环中最后一个命令的退出代码(当循环至少一次时):

j=1
while [ $j -gt 0 ]; do
   ((j--))
   true
done
echo "$? after true"
j=1
while [ $j -gt 0 ]; do
   ((j--))
   false
done
echo "$? after false"

在您的情况下,请尝试以下命令以查看返回值:

j=5; ((j = j - 1 )); echo "$j returns $?"
j=1; ((j = j - 1 )); echo "$j returns $?"

我认为你想要的退出/返回代码不是循环的值。 考虑:

function count_highvalues {
   retval=0
   while [[ ${i} -gt 0 ]]; do
      (( j = ${#MY_ARRAY[@]} ))
      if [[ ${i} -ge ${j} ]]; then
         ((retval++))
      fi
      ((i--))
   done
   return ${retval}
}

只需完成所做的事情,然后返回/退出你想要的东西 尝试将返回/退出值设为0,使其成为OK / true。

有时你想要退出,有时候是退货。退出将完成当前脚本,并仅返回当前函数 请尝试以下代码:由于脚本已退出,因此您将看不到“After f2”。

function f1 {
   return 1
}

function f2 {
   exit 2
}

echo "Before f1"
f1
echo "After f1: $?"
echo "Before f2"
f2
echo "After f2: $?"