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。空值参数被解释为零。

无论如何,按照上面的方式调用,它会打印:

$(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将格式字符串作为参数传递也可能很有用。

相关内容