【问题标题】:Bash - looping through INI sectionsBash - 遍历 INI 部分
【发布时间】:2019-03-18 15:07:35
【问题描述】:

我的问题是关于如何读取包含多个部分的 ini 文件并将部分值输入到循环中的变量中。

这是我的 batch.ini 文件

[section1]
val1='/home/test/'
val2='-i -200 -j 400%'

[section2]
val1='/home/test2/'
val2='-i -320 -j 333%'

[section3]
val1='/home/test3/'
val2='-i -223 -j 555%'

在我的 bash 脚本中,我想一次遍历一个部分,并将值分配给我的 bash 脚本中的变量。我的伪代码是这样的:

for sectionx = 1 to (number of sections)
do
   my_var1=sectionx(val1)
   my_var2=sectionx(val2)
   echo $my_var1 
   echo $my_var2 
done

输出:

/home/test/
-i -200 -j 400%
/home/test2/
-i -320 -j 333%
/home/test3/
-i -223 -j 555%

【问题讨论】:

  • 你试过什么?您现有的代码在哪里?作为记录,当我这样做时,我最终使用了 awk,这是一个很好的、可怕的组合。下一次,我只会使用 perl。
  • @Tanktalus 至少有一个伪代码。但是您的建议似乎是正确的方法。
  • “你尝试了什么”更多的是关于 sectionx(...) 伪调用而不是调用者。

标签: bash for-loop ini


【解决方案1】:

如果您需要在 bash 中读取 .ini 文件,我建议您使用已经实现的解决方案,例如 rudimeier 的 Bash ini parser 效果很好。

还有其他选项,例如shinialbfan 的解析器。

使用 rudimeier 的一个,您将获得相应命名的 bash 变量中的所有值。

例如你的 ini

[section1]
val1='/home/test/'
val2='-i -200 -j 400%'

[section2]
val1='/home/test2/'
val2='-i -320 -j 333%'

[section3]
val1='/home/test3/'
val2='-i -223 -j 555%'

您将获得以下 bash 变量:

INI__ALL_SECTIONS='section1 section2 section3'
INI__ALL_VARS='INI__section1__val1 INI__section1__val2 INI__section2__val1 INI__section2__val2 INI__section3__val1 INI__section3__val2'
INI__NUMSECTIONS=3

INI__section1__val1=/home/test/
INI__section1__val2='-i -200 -j 400%'
INI__section2__val1=/home/test2/
INI__section2__val2='-i -320 -j 333%'
INI__section3__val1=/home/test3/
INI__section3__val2='-i -223 -j 555%'

这样你就可以遍历节和变量,例如:

for section in $INI__ALL_SECTIONS; do 
  echo "Variables in $section:"; 
  for var in `declare | grep "^INI__"$section"__"`; do 
    echo $var; 
  done; 
done;

将产生:

Variables in section1:
INI__section1__val1=/home/test/
INI__section1__val2='-i -200 -j 400%'

Variables in section2:
INI__section2__val1=/home/test2/
INI__section2__val2='-i -320 -j 333%'

Variables in section3:
INI__section3__val1=/home/test3/
INI__section3__val2='-i -223 -j 555%'

【讨论】:

  • 感谢您的建议。实际上我已经尝试过了,它可以将我的 .ini 文件读入一组变量,但是,我看不到在 for 循环中以编程方式寻址变量的方法:for ((i=1;ini_sec<=${INI__NUMSECTIONS};i++)); do echo "section1 var1 = ${INI__section1__var1}" done
  • 除了作为一个仅链接的答案之外,该项目还有一些问题并且似乎没有得到维护。 (大量待处理的拉取请求和未解决的问题,在 6 年内没有重大活动。)
  • @ThatDude 称其为“仅链接答案”有点丢脸。我个人认为这是“不要重新发明轮子”的答案。正如我提到的,有很多选项(比我链接的选项要多得多)。该解决方案工作正常,如我的编辑中所述。我可以编写完全符合 OP 要求的新代码,但我为什么要这样做?其他人已经这样做了,它可以工作并满足 OP 的需求。
  • 你说得对,我试图与其他用户联系并错误地将你的名字放在那里。关于循环:对不起,我的代码有问题。我已经更新了,请再检查一下。
  • 我通过在第二个for...loop 之前添加IFS=$'\n' 解决了这个问题。现在一切正常。谢谢@brunorey
猜你喜欢
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多