是的,这是一个限制bash
.
这不是脚本大小限制;而是脚本大小限制。相反,它是对解析器堆栈深度的限制,这具有限制某些构造的复杂性的效果。特别是,它将限制数量elif
中的条款if
声明到2500左右。
在我的回答中,针对不同的语法结构(迭代管道)对这个问题进行了更长的分析一个问题 https://unix.stackexchange.com/q/185923/24557 on the Unix 和 Linux 堆栈交换 http://unx.stackexchange.com/ site.
case
语句没有这个限制,并且您提供的示例看起来确实很适合case
陈述。
(与的区别case
陈述的语法是if
条件语句,就像管道结构一样,是右递归的,而语法case
语句是左递归的。限制的原因if
语句与管道的限制不同之处在于,语句的语法结构elif
子句多了一个符号,因此每次重复使用四个堆栈槽而不是三个。)
If the case
语句对你不起作用——或者即使它起作用——你可以尝试构建一个预编译的二叉搜索树if
声明:
if (( task_number < 8 )); then
if (( task_number < 4 )); then
if (( task_number < 2 )); then
if (( task_number < 1)); then
# do task 0
else
# do task 1
fi;
elif (( task_number < 3 )); then
# do task 2
else
# do task 3
fi
elif (( task_number < 6 )); then
if (( task_number < 5 )); then
# do task 4
else
# do task 5
fi
elif (( task_number < 7 )); then
# do task 6
else
# do task 7
fi
elif (( task_number < 12 )); then
if (( task_number < 10 )); then
if (( task_number < 9 )); then
# do task 8
else
# do task 9
fi
elif (( task_number < 11 )); then
# do task 10
else
# do task 11
fi
elif (( task_number < 14 )); then
if (( task_number < 13 )); then
# do task 12
else
# do task 13
fi
elif (( task_number < 15 )); then
# do task 14
else
# do task 15
fi
因为每一个完整的if
语句被识别后只占用一个堆栈节点,复杂度限制将取决于语句的嵌套深度if
语句的数量而不是子句的数量。作为额外的好处,它在一般情况下执行的比较要少得多。
如果除了按顺序列出条件之外别无选择,则可以使用单独的条件if
声明:
while :; do
if condition1; then
# do something
break; fi; if condition2; then
# do something
break; fi; if condition3; then
# do something
break; fi; if condition4; then
# do something
break; fi
# No alternative succeeded
break
done
非常规缩进旨在说明简单的程序转换:只需替换每个elif
with break;fi;if
并用一个包围整个事物while
(提供目标break
s.)