0

for ループ内の引数のリストをリストとして扱うことはできますか? リスト インデックスを使用してリスト内の要素にアクセスできますか? この疑似コードを実行します。

#!/bin/bash
for i in 1 2; do
    j=the next element in the for loop
    echo current is $i and next is $j
done

出力は最初の反復である必要があります。

現在は 1、次は 2

ループの 2 回目の繰り返しはどうなるでしょうか?

4

3 に答える 3

3

バッシュな人は常に最も複雑なことを求めているように感じます。あなたも一緒に暮らすことができますか:

# Let's say we want to access elements 1,3,3,7 in this order
cur=$1
for next in "$3" "$3" "$7"
do
    printf "cur: %s, next: %s\n" "$cur" "$next"
    cur=$next
done

What will it be for thesecondlast iteration of the loop?

あなたがそれに答えられないなら、私もです。それは通常、あなたが複雑に考えすぎることを意味します。私がより単純だと考える上記のバージョンには、最後の反復が「欠落」しているという点で異なるため、このコーナーが非常に自然な方法ではありません。

于 2012-07-12T10:10:40.490 に答える
3

代わりに次のコードを試してください。

declare -a data=(1 2)

for (( i = 0 ; i < ${#data[@]} ; i++ )) do
    elem=${data[$i]}
    j=$((i+1))
    nextElem=${data[$j]}
    echo current is $i $elem and next is $j $nextElem
done

関連している:

于 2012-07-12T08:55:02.407 に答える
1

forループ内の次の要素がどうなるかをスパイする (実用的な) 方法はありません。値を別の場所に保存するか、別のタイプのループを使用する必要があります。

位置パラメータまたは配列のいずれかを使用できます。

位置パラメータはスパースではないことが保証されています。

set -- {a..f}
n=1

while ((n<=$#)); do
    printf 'cur: %s%.s%s\n' "${!n}" $((++n)) ${!n:+", next: ${!n}"}
done

Bash 配列はまばらです。forループを使用して値を直接反復していない場合は、代わりにインデックスを使用する必要があります。

arr=({a..f}) idx=("${!arr[@]}")

while ((n<${#idx[@]})); do
    printf 'cur: %s%s\n' "${arr[idx[n]]}" ${idx[++n]:+", next: ${arr[idx[n]]}"}
done

連続した要素を保証できると考えている場合でも、このアプローチは悪い考えではありません。

両方の例の出力:

cur: a, next: b
cur: b, next: c
cur: c, next: d
cur: d, next: e
cur: e, next: f
cur: f
于 2012-07-12T09:56:52.483 に答える