检测 POSIX sh 中循环的最后一次迭代

检测 POSIX sh 中循环的最后一次迭代

在 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

相关内容