Forループフォーマット

Forループフォーマット

長い入力文字列の入れ子になったforループの書式設定に問題があります。

私は、現在省略している個々のプログラムの出力ファイル名を指定するために、次のネストされたforループを使用しています。

#!/bin/bash
for hemi in lh rh
do
    for measure in thickness area volume meancurv gauscurv foldind curvind
    do
        echo ${hemi}"--"${measure}
    done
done

変更する必要があるより長い配列のリストを使用して、さまざまなループを簡単に実行できるように、次のようにループ形式を指定できるようにしたいと思います。 1つの場所でリストを修正するだけで、エラー/欠落などの可能性が大幅に減少します。

#!/bin/bash

hemi=( lh rh )
measure=( thickness area volume meancurv gauscurv foldind curvind )

for((i=${hemi[${i}]};i<2;i++));do
    for((j=${measure[${j}]};j<7;j++));do
        echo ${hemi[${i}]}"--"${measure[${j}]}
    done
done

これは私が得た結果であり、私が間違っているかどうかはわかりません。

lh--thickness
lh--area
lh--volume
lh--meancurv
lh--gauscurv
lh--foldind
lh--curvind
./for_loop_testing.sh: line 7: ((: j=: syntax error: operand expected (error token is "=")

答え1

簡略化されたバージョンを提供します。

for i in "${hemi[@]}"; do
    for j in "${measure[@]}"; do
        echo "$i--$j"
    done
done

要点は"${array[@]}"すべての配列要素に拡張することなので、ここではすべての要素を繰り返し sum 変数に入れて印刷しますij

注:特に要素にスペースを含めることができる場合は、変数と配列の周囲に二重引用符を付けることを忘れないでください。

答え2

割り当てた値の代わりにi合計をゼロに初期化する必要があります。jしたがって、ループは次のようになります。

for((i=0;i<${#hemi[@]};i++));do
        for((j=0;j<${#measure[@]};j++));do
            echo "${hemi[$i]}--${measure[$j]}"
        done
    done

${#array[@]}配列の要素数を提供します。 (バス配列には穴(連続していない要素)がある可能性があるため、穴がない場合にのみこれを使用してください。)

答え3

カンマを使用してリストを変更しても問題ない場合は、次のようにします。

#!/bin/bash
printf "%s\n" {lh,rh}--{thickness,area,volume,meancurv,gauscurv,foldind,curvind}

この拡張をevalの変数と連携させる方法があります。簡単ではありませんが、実行可能です。必要に応じて尋ねてください。

編集1:

万が一に備えてこれが反対票を投げる理由になります。
提案では、スペース、アスタリスク、その他の難しい名前を管理することを明確にします。努力する:

printf "%s\n" {lh,rh}--{"hello world",foldind," * ",curvind}

「カンマ区切り値」とよく似た形式です。

関連情報