Arrays 如何在bash中嵌套变量并循环子变量
我正在尝试编写一个脚本,从mysql生成csv文件。mysql中的csv文件运行良好,但是,我正在努力寻找一种循环变量的方法,或者将它们作为一个数组进行循环 下面是一些示例变量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="
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
中。谢谢,这就是我要找的!