我有一个小脚本,应该打印对我得到的 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
将格式字符串作为参数传递也可能很有用。