Arrays 如何在bash中嵌套变量并循环子变量

Arrays 如何在bash中嵌套变量并循环子变量,arrays,bash,shell,loops,Arrays,Bash,Shell,Loops,我正在尝试编写一个脚本,从mysql生成csv文件。mysql中的csv文件运行良好,但是,我正在努力寻找一种循环变量的方法,或者将它们作为一个数组进行循环 下面是一些示例变量 c1="Client 1" c1_s1_name=Alpha c1_s1_id=761967 c1_s2_name=Beta c1_s2_id=415612 c2="Client 2" c2_s1_name=XYZ c2_s1_id=438976 c2_s2_name=ABC c2_s2_id=982012 c3="

我正在尝试编写一个脚本,从mysql生成csv文件。mysql中的csv文件运行良好,但是,我正在努力寻找一种循环变量的方法,或者将它们作为一个数组进行循环

下面是一些示例变量

c1="Client 1"
c1_s1_name=Alpha
c1_s1_id=761967
c1_s2_name=Beta
c1_s2_id=415612

c2="Client 2"
c2_s1_name=XYZ
c2_s1_id=438976
c2_s2_name=ABC
c2_s2_id=982012

c3="Client 3"
c3_s1_name=No-Name
c3_s1_id=347654
c3_s2_name=House
c3_s2_id=109321
然后,我有一些准代码,尝试为每个
客户机运行sql脚本,如下所示

# loop through all clients
for all_clients in $c1 $c2 $c3
do

# and then loop through for all survey names and all survey ids for each seperate client
for survey_name in $*_name and survey_id in $*_id
do
mysql -h "localhost" -u "root" "$DATABASE" -e "SELECT count(*) FROM $survey_id" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $all_clients-$survey_name-filename-count.csv
done

done
我不知道如何设置脚本,使
c1
变量作为一组运行,然后
c2
,然后是
c3
。我猜数组可能是我需要的,但我不确定

我也遇到了下面的答案,但它是针对PHP的,尽管它看起来很像bash


您需要构建动态变量的名称,然后使用
{!var}
语法取消对它的引用。假设您事先知道变量名(即第一部分始终是
c1
c2
c3
,第二部分始终是
s1
s2
,…),您可以使用这样的内容:

for x in c1 c2 c3; do
  for y in s1 s2; do
    for z in name id; do
      xyz=${x}_${y}_${z}
      # Use ${!xyz} to get the contents of the variable
    done
  done
done
(但显然没有mysql调用)

我使用了
x
y
z
来强调变量是如何构造的,但是 您可以将
x
替换为
所有客户端
,等等

如果事先不知道
c*
s*
的数量,可以使用稍微高级一点的技术

numc=3
nums=2
for x in $(seq -f 'c%g' $numc); do
  for y in $(seq -f 's%g' $nums); do
    for z in name id; do
      xyz=${x}_${y}_${z}
      # Use ${!xyz} to get the contents of the variable
    done
  done
done

这里的魔力来自。例如,在以下调用中:

seq -f 'c%g' $numc
$numc
选项表示要从
1
迭代到
$numc
-f'c%g'
选项表示要形成类似于
printf
的字符串,在本例中,字母
c
后跟数值。因此,上面的示例将写:

c1
c2
c3
整个字符串由
$()
捕获,这意味着输出将内联到脚本中。总而言之,以下行:

for x in $(seq -f 'c%g' $numc); do
将被解释为:

for x in c1 c2 c3; do

这相当于
循环的初始
,除了现在你可以控制迭代次数之外。

如果事先不知道c*和s*的数量,你可以使用稍微高级一点的技术。这看起来非常有用,因为
c*
s*
的数量将是未知的,但我不理解
numc=3
nums=2
这是一个来自其他地方的值的例子,在这个例子中,我只定义了一个变量。您可以通过任何方式获取数字:从文件中,读取用户输入的数据,等等。例如,
read-p“请输入c的数字:”numc
将要求用户从键盘键入一个数字,并将其存储在变量
numc
中。谢谢,这就是我要找的!