在 POSIX sh 中,是否可以检测for
循环内循环的最后一次迭代?
我试图填补此示例代码中的空白:
#!/bin/sh
items='1 2 3'
for item in $items; do
echo "$item"
# TODO:
# How do I check whether or not this is the last iteration?
done
答案1
items='1 2 3'
for item in $items; do
商店一串成一串标量变量$items
,然后由于未加引号的扩展,该字符串在下一行会受到 IFS 分割 + 通配符的影响$items
。
要存储多个值,您需要使用数组变量。
POSIXsh
没有数组,但它有位置参数,这甚至是for
默认循环的:
set 1 2 3
i=1
for item do
if [ "$i" -eq "$#" ]; then
echo last
fi
printf '%s\n' "Current item: $item"
i=$(( i + 1 ))
done
或者:
set 1 2 3
while [ "$#" -gt 0 ]; do
if [ "$#" -eq 1 ]; then
echo last
fi
printf '%s\n' "Current item: $1"
shift
done
如果您仍然想拆分+通配一个空格分隔的$items
变量,您仍然可以这样做:
set -- $items # $items split+globbed and the result stored in $1, $2...
或者,如果您不想破坏脚本的位置参数,请使用一个函数(它有自己的一组位置参数):
loop() {
i=1
for item do
if [ "$i" -eq "$#" ]; then
echo last
fi
printf '%s\n' "Current item: $item"
i=$(( i + 1 ))
done
}
loop 1 2 3
items='1 2 3'
loop $items