MER*_*ose 4 array shell-script brace-expansion
我想生成一些仅按年份不同的数组。在循环中,我创建了带有大括号扩展和变量的数组。
我尝试了以下代码但没有成功:
LIST={JF,JFE,RFS,JBF,JFI,JMCB}
for year in {1998..2000} {2009..2011}
do
declare -a 'y$year=('"$LIST"'-$year)'
echo "${y$year[@]}"
done
Run Code Online (Sandbox Code Playgroud)
结果应该是以下条目的列表:
y1998: JF-1998 JFE-1998 RFS-1998 JBF-1998 JFI-1998 JMCB-1998
y1999: JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999
...
y2011: JF-2011 JFE-2011 RFS-2011 JBF-2011 JFI-2011 JMCB-2011
Run Code Online (Sandbox Code Playgroud)
我不需要打印它们,只需在循环中使用它们并将它们作为参数传递即可。因为第二,eval
在循环中是不够的。
推迟大括号扩展确实是 的一个例子eval
,特别是如果你想字符串化——普通的参数扩展不会在正确的时间做正确的事情。
这应该做你想要的:
LIST={JF,JFE,RFS,JBF,JFI,JMCB}
for year in {1998..2000} {2009..2011}
do
eval "y$year=($LIST-$year)"
tmp="y$year[@]"
echo "${!tmp}"
done
Run Code Online (Sandbox Code Playgroud)
你不能间接进入一个数组,所以 eval
如果你想打印出来,也有必要在一个数组中字符串化它。如果不这样做,您可以取出;
. tmp
用于间接扩展:tmp
设置为"y$year[@]"
, where$year
被替换为它的值,扩展${!tmp}
给出了这次迭代数组的内容(什么${y1998[@]}
等,会扩展到)。
以上将输出:
JF-1998 JFE-1998 RFS-1998 JBF-1998 JFI-1998 JMCB-1998
JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999
JF-2000 JFE-2000 RFS-2000 JBF-2000 JFI-2000 JMCB-2000
JF-2009 JFE-2009 RFS-2009 JBF-2009 JFI-2009 JMCB-2009
JF-2010 JFE-2010 RFS-2010 JBF-2010 JFI-2010 JMCB-2010
JF-2011 JFE-2011 RFS-2011 JBF-2011 JFI-2011 JMCB-2011
Run Code Online (Sandbox Code Playgroud)
并且还创建数组y1998
... y2011
。该declare
s为不是绝对必要的,虽然他们让你跳过eval
,如果你的目标为,并不需要字符串化。
我建议这可能不是你真正想要实现你的潜在目标的方式,不管那是什么。嵌套循环并不是邪恶的,如果有任何部分是硬编码的,您可以将其抽象出来。