Para formatação de loop

5

Estou com problemas para formatar loops aninhados por longas cadeias de entrada:

No momento, estou usando os loops for aninhados abaixo para nomear os arquivos de saída de um programa separado que omiti:

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

Gostaria de poder formatar os loops como abaixo para facilitar a execução de vários loops diferentes com listas de arrays muito mais longas que talvez precisem ser modificadas. Apenas a necessidade de modificar a lista em um único local reduzirá bastante a chance de erros / omissões, etc.

#!/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

Esta é a saída que estou recebendo e não consigo entender o que estou fazendo de errado:

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 "=")
    
por yz426f 20.08.2015 / 03:13

3 respostas

14

Deixe-me oferecer uma versão simplificada:

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

O ponto é que "${array[@]}" se expande para todos os elementos da matriz, então, aqui, vamos apenas iterar todos os elementos, colocá-los nas variáveis i e j e depois imprimi-los.

Como observação: não se esqueça de colocar aspas duplas em torno de variáveis e matrizes, especialmente se algum elemento puder conter espaços em branco.

    
por 20.08.2015 / 03:47
7

Você precisa inicializar i e j para 0 em vez do valor que está atribuindo. então, o loop será parecido com:

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

${#array[@]} fornece o número de elementos na matriz. (Observe que as matrizes do bash podem ter furos (elementos não contíguos), portanto, use-as somente se você souber que elas não têm.)

    
por 20.08.2015 / 03:25
3

Se você não se importa em reformar suas listas com vírgulas, basta fazer isso:

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

Existem algumas maneiras de fazer com que essas expansões usem variáveis com eval, não tão fácil, mas factível. Pergunte se necessário.

Editar 1:

Apenas no caso de este ser o motivo de um downvote.
Vou esclarecer que essa proposta gerencia espaços, asteriscos e alguns outros nomes difíceis. Experimente:

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

É um formato muito semelhante a "valores separados por vírgulas".

    
por 20.08.2015 / 07:02