for
POSIX 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