在循环中创建带有大括号扩展的数组

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在循环中是不够的。

Mic*_*mer 6

推迟大括号扩展确实是 的一个例子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。该declares为不是绝对必要的,虽然他们让你跳过eval,如果你的目标为,并不需要字符串化。

我建议这可能不是你真正想要实现你的潜在目标的方式,不管那是什么。嵌套循环并不是邪恶的,如果有任何部分是硬编码的,您可以将其抽象出来。