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

수정해야 할 수 있는 더 긴 배열 목록을 사용하여 여러 다른 루프를 쉽게 실행할 수 있도록 아래와 같이 루프 형식을 지정할 수 있기를 원합니다. 한 곳에서 목록을 수정하기만 하면 오류/누락 등의 가능성이 크게 줄어듭니다.

#!/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합계를 0으로 초기화 해야 합니다 . j따라서 루프는 다음과 같습니다.

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

${#array[@]}배열의 요소 수를 제공합니다. (Bash 배열에는 구멍(연속되지 않은 요소)이 있을 수 있으므로 구멍이 없는 경우에만 이것을 사용하십시오.)

답변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}

"쉼표로 구분된 값"과 매우 유사한 형식입니다.

관련 정보