繁体   English   中英

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

[英]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}语法取消引用它。 假设您事先知道变量名称(即第一部分始终是c1c2c3 ,第二部分始终是s1s2 ,……),您可以使用以下内容:

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 调用)

我已经使用xyz来强调变量的构造方式,但您可以将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM