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が実際に1つの呼び出しである必要があるときに分離されることです。このように:

$(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

私が知っている限り、変数定義にあまりにも多くの静的データを含めることは問題かもしれません。実際の変数データは、各数字が繰り返されるたびに1つずつ増加する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

...ここで、最初のパラメータは反復回数で、次の3つのパラメータは$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型文字列をパラメータとして渡すことも便利です。

関連情報