POSIX sh でループの最後の反復を検出します。

POSIX sh でループの最後の反復を検出します。

forPOSIX shでは、ループ内のループの最後の反復を検出できますか?

このサンプルコードの空白を埋めようとしています。

#!/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

複数の値を保存するには、配列変数を使用する必要があります。

POSIXにはsh配列はありませんが、デフォルトで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

関連情報