for 루프 목록

for 루프 목록

내가 얻은 makefile에 대한 여러 호출을 인쇄하도록 되어 있는 작은 스크립트가 있습니다.

mylist='$(call list_samples,AON_9,NT_1,SC_17) $(call list_samples,AON_10,NT_2,SC_18) $(call list_samples,AON_11,NT_3,SC_19) $(call list_samples,AON_12,NT_4,SC_20) $(call list_samples,AON_13,NT_5,SC_21) $(call list_samples,AON_14,NT_6,SC_22) $(call list_samples,AON_15,NT_7,SC_23) $(call list_samples,AON_16,NT_8,SC_24)'

for SAMPLES_OUT in $mylist;
do
echo "$SAMPLES_OUT"
done

산출:

$(call
list_samples,AON_9,NT_1,SC_17)
$(call
list_samples,AON_10,NT_2,SC_18)
$(call
list_samples,AON_11,NT_3,SC_19)
$(call
list_samples,AON_12,NT_4,SC_20)
$(call
list_samples,AON_13,NT_5,SC_21)
$(call
list_samples,AON_14,NT_6,SC_22)
$(call
list_samples,AON_15,NT_7,SC_23)
$(call
list_samples,AON_16,NT_8,SC_24)

내가 겪고 있는 문제는 for 루프가 공백으로 분할되므로 $call과 list_samples가 실제로 하나의 호출이어야 할 때 분리된다는 것입니다. 이와 같이:

$(call list_samples,AON_9,NT_1,SC_17)
$(call list_samples,AON_10,NT_2,SC_18)
$(call list_samples,AON_11,NT_3,SC_19)
$(call list_samples,AON_12,NT_4,SC_20)
$(call list_samples,AON_13,NT_5,SC_21)
$(call list_samples,AON_14,NT_6,SC_22)
$(call list_samples,AON_15,NT_7,SC_23)
$(call list_samples,AON_16,NT_8,SC_24)

문자열을 ""에 넣으려고 했지만 ""로 생성된 목록이고 그 사이의 모든 것을 문자열로 처리하기 때문에 작동하지 않습니다. 어떤 조언이라도 감사하겠습니다. 감사해요!

답변1

기본값이 아닌 다른 구분 기호(공백, 탭 및 줄 바꿈)를 사용할 수도 있습니다.

mylist='
$(call list_samples,AON_9,NT_1,SC_17) 
$(call list_samples,AON_10,NT_2,SC_18) 
$(call list_samples,AON_11,NT_3,SC_19) 
$(call list_samples,AON_12,NT_4,SC_20) 
$(call list_samples,AON_13,NT_5,SC_21) 
$(call list_samples,AON_14,NT_6,SC_22) 
$(call list_samples,AON_15,NT_7,SC_23) 
$(call list_samples,AON_16,NT_8,SC_24)
'

IFS='
'       # split on newline only
set -f  # disable globbing
for samples_out in $mylist # invoke the split+glob operator
do
  printf '%s\n' "$samples_out"
done

이렇게 하면 표준 구문을 계속 사용할 수 있습니다 sh.

답변2

요소를 함께 보관하려면 배열을 사용해야 합니다.

mylist=(
    '$(call list_samples,AON_9,NT_1,SC_17)'
    '$(call list_samples,AON_10,NT_2,SC_18)'
    '$(call list_samples,AON_11,NT_3,SC_19)'
    '$(call list_samples,AON_12,NT_4,SC_20)'
    '$(call list_samples,AON_13,NT_5,SC_21)'
    '$(call list_samples,AON_14,NT_6,SC_22)'
    '$(call list_samples,AON_15,NT_7,SC_23)'
    '$(call list_samples,AON_16,NT_8,SC_24)'
)
for SAMPLES_OUT in "${mylist[@]}"    # crucial to use quotes here
do
    echo "$SAMPLES_OUT"
done

답변3

내가 아는 한, 변수 정의에 너무 많은 정적 데이터를 포함시키는 것이 문제일 수 있습니다. 실제 변수 데이터는 각 숫자가 반복될 때마다 하나씩 증가하는 세 개의 숫자로 구성된 단순한 집합인 것 같습니다. 이제 남은 건 옷을 입는 일뿐이다. 그럼 어쩌면...

 pr_samples()( 
     for n in lmt AON NT SC
     do  : "$(($n=(${1##*[!-0-9]*}0/10)-1))"
            shift "$((!!$#))"
     done;  lmt=$((lmt+AON+1))
     until [ "$AON" -gt "$lmt" ]
     do    printf '$(call list_samples,AON_%d,NT_%d,SC_%d)\n' \
                  "$((AON+=1))" "$((NT+=1))" "$((SC+=1))"
     done
)

...이렇게 호출하면 컬렉션이 생성됩니다.

 pr_samples 7 9 1 17

...여기서 첫 번째 매개변수는 반복 횟수이고 다음 세 매개변수는 $AON, $NT및 의 초기 값입니다 $SC. Null 인수는 0으로 해석됩니다.

어쨌든 위와 같이 호출하면 다음과 같이 인쇄됩니다.

$(call list_samples,AON_9,NT_1,SC_17)
$(call list_samples,AON_10,NT_2,SC_18)
$(call list_samples,AON_11,NT_3,SC_19)
$(call list_samples,AON_12,NT_4,SC_20)
$(call list_samples,AON_13,NT_5,SC_21)
$(call list_samples,AON_14,NT_6,SC_22)
$(call list_samples,AON_15,NT_7,SC_23)
$(call list_samples,AON_16,NT_8,SC_24)

printf형식 문자열을 매개변수로 전달하는 것도 유용할 수 있습니다.

관련 정보