[英]How to nest variables and loop through sub-variables in bash
我正在尝试编写一个从 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
然后我有一些准代码尝试为每个client
运行一个 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
替换为all_clients
等。
如果事先不知道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
。 例如,在以下调用中:
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
这等效于初始for
循环,不同之处在于现在您可以控制迭代次数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.