Grr*_*Grr 1 bash shell for-loop
我正在努力习惯shell脚本,并遇到了一个我发现有趣且无法解释的行为.在下面的代码中,第一个for循环将正确执行,但第二个不会.
declare letters=(a b c d e f g)
for i in {0..7}; do
echo ${letters[i]}
done
for i in {0..${#letters[*]}}; do
echo ${letters[i]}
done
Run Code Online (Sandbox Code Playgroud)
第二个for循环导致以下错误:
syntax error: operand expected (error token is "{0..7}")
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,${#letters[*]}显然正确地对数字7进行了评估.但尽管如此,即使我们只看到相同的循环{0..7}工作完全正常,代码也会失败.
这是什么原因?
我正在运行OS X 10.12.2,GNU bash版本3.2.57.
括号扩展在参数扩展之前发生(请参阅EXPANSIONS in man bash),因此它仅适用于文字.换句话说,您不能对变量使用大括号扩展.
您可以使用C风格的循环:
for ((i=0; i<${#letters[@]}; i++)) ; do
echo ${letters[i]}
done
Run Code Online (Sandbox Code Playgroud)
或外部命令,如seq:
for i in $(seq 1 ${#letters[@]}) ; do
echo ${letters[i-1]}
done
Run Code Online (Sandbox Code Playgroud)
但是你通常不需要索引,而是在元素本身上循环,请参阅下面的@ TomFenech的答案.他还展示了另一种获取指数清单的方法.
请注意,它应该是{0..6},而不是7.
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |