代码之家  ›  专栏  ›  技术社区  ›  Saurabh Kumar

从bash读取yml文件并将其存储到变量中

  •  -3
  • Saurabh Kumar  · 技术社区  · 6 年前

    我想读取下面的yml文件并在bash中将其构造为3个变量?

    services:
      app: mysql
       port:
       service: mysql
      app: mongo_instance
       port:
       service: mongo
      app: restful_api
       port: 5000
       service: api
    

    我需要的结构:

    apps_order=("mysql" "restful_api" "mongo_instance")
    ports=("" "5000" "")
    service=("mysql" "api" "mongo")
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   glenn jackman    6 年前

    好的,给出关于YAML数据的澄清,我们可以解析它。YAML是一组包含XML、JSON和CSV的数据格式,您确实需要使用适当的解析器。我将使用Ruby(附带YAML库)读取文件并输出bash代码。shell将获取该输出以创建shell数组。

    $ source <(
        ruby -e '
            require "yaml"
            result = Hash.new {|h,k| h[k] = Array.new}
            data = YAML.load_file(ARGV.shift)
            data["services"].each do |obj|
                obj.keys.each {|k| result[k] << obj[k]}
            end
            result.each_pair do |k,v|
                printf "%ss=(%s)\n", k, v.map {|e| "\"#{e}\""}.join(" ")
            end
        ' file.yaml
    )
    
    $ declare -p apps ports services
    declare -a apps=([0]="mysql" [1]="mongo_instance" [2]="restful_api")
    declare -a ports=([0]="" [1]="" [2]="5000")
    declare -a services=([0]="mysql" [1]="mongo" [2]="api")
    
        2
  •  0
  •   glenn jackman    6 年前

    (不是答案,而是格式化的评论)

    services:
    - app: mysql
      port: ''
      service: mysql
    - app: mongo_instance
      port: ''
      service: mongo
    - app: restful_api
      port: 5000
      service: api