【发布时间】:2016-09-01 21:38:10
【问题描述】:
我通常编写 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
否则,我错过了什么/做错了什么?
谢谢。
【问题讨论】:
-
一组很好的假设/问题。您可以通过将
export PS3='$LINENO >' ; set -vx添加为脚本的第二行来自己测试这些假设。您将在执行之前看到每组命令(例如整个 while 循环),然后以+(和3 >(LINENO))开头的行显示每行执行时变量的实际值。有时很难说出什么是什么,您可能必须增强调试输出,例如print -- -u2 "#DBG: i=$i \tj=$j ..."。祝你好运。