長い入力文字列の入れ子になった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 変数に入れて印刷しますi
。j
注:特に要素にスペースを含めることができる場合は、変数と配列の周囲に二重引用符を付けることを忘れないでください。
答え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}
「カンマ区切り値」とよく似た形式です。