为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Shell脚本中获取INI值?

/ 猿问

如何在Shell脚本中获取INI值?

慕森卡 2019-12-21 12:50:31

我有一个parameters.ini文件,例如:


[parameters.ini]

    database_user    = user

    database_version = 20110611142248

我想从bash shell脚本中读取并使用parameters.ini文件中指定的数据库版本,以便进行处理。


#!/bin/sh    

# Need to get database version from parameters.ini file to use in script    

php app/console doctrine:migrations:migrate $DATABASE_VERSION

我该怎么做?


查看完整描述

3 回答

?
临摹微笑

然后使用awk对该行进行grepping如何


version=$(awk -F "=" '/database_version/ {print $2}' parameters.ini)


查看完整回答
反对 回复 2019-12-21
?
弑天下

您可以通过以下方式使用bash本机解析器来解释ini值:


$ source <(grep = file.ini)

样本文件:


[section-a]

  var1=value1

  var2=value2

  IPS=( "1.2.3.4" "1.2.3.5" )

要访问变量,只需打印它们:echo $var1。您也可以使用上面(echo ${IPS[@]})所示的数组。


如果您只想要一个值,只需grep即可:


source <(grep var1 file.ini)

这很简单,因为您不需要任何外部库来解析数据,但是它有一些缺点。例如:


如果在=(变量名和值)之间有空格,则必须先修剪空格,例如


$ source <(grep = file.ini | sed 's/ *= */=/g')

或者,如果您不关心空格(包括中间的空格),请使用:


$ source <(grep = file.ini | tr -d ' ')

要支持;评论,请将其替换为#:


$ sed "s/;/#/g" foo.ini | source /dev/stdin

不支持这些部分(例如,如果您具有[section-name],则必须如上所示将其过滤掉,例如grep =),对于其他意外错误也是如此。


如果你需要阅读在特定的部分具体值,使用grep -A,sed,awk或ex)。


例如


source <(grep = <(grep -A5 '\[section-b\]' file.ini))

注意:在哪里-A5是本节中要读取的行数。替换source为cat进行调试。


如果您有任何解析错误,请通过添加以下内容来忽略它们: 2>/dev/null


查看完整回答
反对 回复 2019-12-21
?
哔哔one

Bash不为这些文件提供解析器。显然,您可以使用awk命令或几个sed调用,但是如果您是bash牧师,并且不想使用任何其他shell,则可以尝试使用以下晦涩的代码:


#!/usr/bin/env bash

cfg_parser ()

{

    ini="$(<$1)"                # read the file

    ini="${ini//[/\[}"          # escape [

    ini="${ini//]/\]}"          # escape ]

    IFS=$'\n' && ini=( ${ini} ) # convert to line-array

    ini=( ${ini[*]//;*/} )      # remove comments with ;

    ini=( ${ini[*]/\    =/=} )  # remove tabs before =

    ini=( ${ini[*]/=\   /=} )   # remove tabs after =

    ini=( ${ini[*]/\ =\ /=} )   # remove anything with a space around =

    ini=( ${ini[*]/#\\[/\}$'\n'cfg.section.} ) # set section prefix

    ini=( ${ini[*]/%\\]/ \(} )    # convert text2function (1)

    ini=( ${ini[*]/=/=\( } )    # convert item to array

    ini=( ${ini[*]/%/ \)} )     # close array parenthesis

    ini=( ${ini[*]/%\\ \)/ \\} ) # the multiline trick

    ini=( ${ini[*]/%\( \)/\(\) \{} ) # convert text2function (2)

    ini=( ${ini[*]/%\} \)/\}} ) # remove extra parenthesis

    ini[0]="" # remove first element

    ini[${#ini[*]} + 1]='}'    # add the last brace

    eval "$(echo "${ini[*]}")" # eval the result

}


cfg_writer ()

{

    IFS=' '$'\n'

    fun="$(declare -F)"

    fun="${fun//declare -f/}"

    for f in $fun; do

        [ "${f#cfg.section}" == "${f}" ] && continue

        item="$(declare -f ${f})"

        item="${item##*\{}"

        item="${item%\}}"

        item="${item//=*;/}"

        vars="${item//=*/}"

        eval $f

        echo "[${f#cfg.section.}]"

        for var in $vars; do

            echo $var=\"${!var}\"

        done

    done

}

用法:


# parse the config file called 'myfile.ini', with the following

# contents::

#   [sec2]

#   var2='something'

cfg.parser 'myfile.ini'


# enable section called 'sec2' (in the file [sec2]) for reading

cfg.section.sec2


# read the content of the variable called 'var2' (in the file

# var2=XXX). If your var2 is an array, then you can use

# ${var[index]}

echo "$var2"

Bash ini-parser可以在The Old School DevOps博客网站上找到。


查看完整回答
反对 回复 2019-12-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信