내가 얻은 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
형식 문자열을 매개변수로 전달하는 것도 유용할 수 있습니다.