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

관련 정보