当使用“{0..$var}”时 for 循环不起作用

当使用“{0..$var}”时 for 循环不起作用

问题很简单,但我不知道如何解决。代码如下:

missing_filters=('Sort key' 'Page' 'Pagesize' 'Sort direction')

for level in {0..$((${#missing_filters[@]}-1))}
do
    echo "${#missing_filters[$level]}^|^${missing_filters[$level]}"
done | column -tes "^"

它应该显示数组中每个元素,前面有 1-4,如下所示:

1 | Sort key
2 | Page
3 | Pagesize
4 | Sort direction

但是,我得到了错误./advancedplexapi.sh: line 4608: {0..3}: syntax error: operand expected (error token is "{0..3}")。我觉得这很奇怪,因为错误准确地显示了我希望 shell 如何解释它(即{0..3})。我没有做错什么,否则 shell 不会在错误中给我正确的输出。为什么它不起作用?当然,我该如何解决这个问题?

答案1

它没有按预期工作,因为括号扩展是在变量替换之前完成的。

您也可以使用seqfor-loop 来代替:

for level in $(seq 0 $((${#missing_filters[@]}-1))); ...

或者

for (( level=0;level<="$((${#missing_filters[@]}-1))";level++ )); ...

有关详细信息,请参阅这个答案另一个问题。


"${#missing_filters[$level]}"不会给出1 2 3 4,而是扩展到每个值的字符数--> 8 4 8 14。最好使用$((level+1))


但是,您可以更轻松地循环数组键:

for k in "${!missing_filters[@]}"; do
    printf '%s | %s\n' "$((k+1))" "${missing_filters[$k]}"
done

相关内容