Para el formateo de loops

Tengo problemas para formatear los loops nesteds para cadenas largas de input:

Actualmente estoy usando los loops for nesteds para nombrar files de salida de un progtwig separado que he omitido:

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

Me gustaría poder formatear los loops como a continuación para facilitar la ejecución de múltiples loops diferentes con lists de matriz mucho más largas que pueden necesitar ser modificadas. Solo la necesidad de modificar la list en un solo lugar networkingucirá en gran medida la posibilidad de errores / omisiones, 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 

Este es el resultado que obtengo y no puedo descubrir lo que estoy haciendo mal:

 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 "=") 

Déjame ofrecerte una versión simplificada:

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

El punto es que "${array[@]}" expande a todos los elementos de la matriz, de modo que aquí solo iteramos sobre todos los elementos, los ponemos en las variables i y j , y luego los imprimimos.

Como nota al margen: no te olvides de poner comillas dobles alnetworkingedor de variables y matrices, especialmente si algún elemento puede contener espacios en blanco.

Debe inicializar i y j en 0 en lugar del valor que está asignando. Entonces, el ciclo se verá así:

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

${#array[@]} te da la cantidad de elementos en la matriz. (Tenga en count que las matrices de bash pueden tener agujeros (elementos no contiguos), por lo tanto, solo use esto si sabe que no lo hacen).

Si no te importa reformar tus lists con comas, puedes hacer esto:

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

Hay algunas maneras de hacer que estas expansiones usen variables con eval, no tan fácil, pero factible. Pregunte si es necesario.

Editar 1:

Por si acaso este fue el motivo de un voto negativo.
Aclararé que esta propuesta administra espacios, asteriscos y algunos otros nombres difíciles. Tratar:

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

Es un formatting sorprendentemente similar a "valores separados por comas".