我通常编写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
否则,我错过了什么/做错了什么?
感谢。
答案 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: $?"