【问题标题】:Fetch variables values from yml and pass to shell script?从 yml 获取变量值并传递给 shell 脚本?
【发布时间】:2022-11-05 22:06:30
【问题描述】:

数据.yml

variables:
  count: "100"
  name: "sss"
  pass: "123"

文件.sh

#!/bin/bash
echo "Details are "$name":"$pass" - Total value "$count"

我需要从 data.yml 获取变量值并传递给 file.sh

调用 file.sh 应该给出输出:

Details are sss:123 - Total value 100

【问题讨论】:

  • 为什么这被标记为重击 电源外壳?
  • @phd 我已经更新了标签,删除了反对票。谢谢

标签: bash yaml


【解决方案1】:

yq 读取名称值对并使用 bash printf -v 来初始化变量。 有点过头了,但是初始化脚本的好方法。 请注意,添加变量不会更改 while 循环。

文件.sh

#!/bin/bash

while read -r key val; do
    printf -v "$key" "$val"
done < <(yq '.variables[] | key + " " + .' data.yml)

echo "Details are $name: $pass - Total value $count"
echo 'Some extra variables:'
echo "$address: $address, $phone: $phone, $url: $url"

数据.yml

variables:
  count: "100"
  name: "sss"
  pass: "123"
  address: "42 Terrapin Station"
  phone: "999-999-9999"
  url: "http://www.example.com"

输出

详情为 sss:123 - 总值 100
一些额外的变量:
$address: 42 Terrapin Station, $phone: 999-999-9999, $url: http://www.example.com

【讨论】:

  • 它给了我 yq 命令的“错误:错误的表达式,请检查表达式语法”
  • 您可以在某处发布示例吗?
  • github.com/sanurah/yamlexample 我使用了相同的代码。它可能是我当地环境中的东西吗?可能是 bash 版本
  • 我已经升级到 yq 4.29.2,现在我看到了 Error: bad expression, please check expression syntax。我需要更改版本 4 及更高版本的 yq 表达式。
  • 谢谢。我试图玩弄它,但无法修复。如果您找到解决方案,请更新新版本的答案。
【解决方案2】:

您可以使用对yq 的一次调用并将值放入数组中:

#!/usr/bin/env bash
  
mapfile -t array < <(yq '.variables[]' data.yml)
declare -p array

【讨论】:

    【解决方案3】:

    有一个cli工具yq来解析yaml文件。

    脚本如下所示:

    #!/usr/bin/env bash
    name=$(yq '.variables.name' data.yaml)
    pass=$(yq '.variables.pass' data.yaml)
    count=$(yq '.variables.count' data.yaml)
    
    echo "Details are $name: $pass - Total value $count"
    

    当然,您也可以将文件作为参数传递。

    【讨论】:

    • 是否有任何其他解决方案而不使用任何其他工具/cli @gindex
    • @rowoc YAML 很复杂,所以除了使用专门的工具来解析它之外,没有通用的解决方案;也就是说,如果您的输入与您在问题中显示的一样简单,那么您可以使用其他(基本/标准)工具来完成这项工作
    • 是的,有更多选项如何解析command line 上的 yaml,但 yq 是最简单的一种。 yq 也被广泛采用。为什么你不能使用它?
    • @gindex你能重新检查你的解决方案吗,我试过了,不行
    • 现在应该可以工作了。请检查本地文件的名称和脚本中的名称。
    猜你喜欢
    • 2015-09-09
    • 2017-05-24
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多