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