如何解析带引号的字符串中的环境变量?

如何解析带引号的字符串中的环境变量?

我很难获取$GHREPO带引号的字符串中的环境变量 ( ) 的值。这是我正在运行的命令。我正在尝试创建一个目录,其值为 j["ChgSub"][$GHREPO][0]["Major"]$GHREPO 作为环境变量。

 mkdir `cat ../dummy.json | 
 ruby -rjson -e 'j = JSON.parse($stdin.read); puts j["ChgSub"][$GHREPO][0]["Major"].to_s'`

编辑:dummy.json 内容

{

  "ChgSub": {
    "ecx": [
      {
        "Major": 0,
        "Minor": 0,
        "Patch": 3
      }
    ]
  }
}

答案1

变量不会在单引号字符串中求值。您需要使用双引号。如果您不能或不想对整个字符串使用双引号,则可以仅对字符串的该部分使用双引号。

ruby -rjson -e 'j = JSON.parse($stdin.read); puts j["ChgSub"]["'"$GHREPO"'"][0]["Major"].to_s'

这是三个相邻的单独的带引号的字符串。

'j = JSON.parse($stdin.read); puts j["ChgSub"]["'

"$GHREPO"

'"][0]["Major"].to_s'

答案2

您应该始终尽可能避免混合语言。在本例中,您尝试将 shell 脚本混合到 ruby​​ 脚本中。混合语言会使您的代码变得复杂并使其脆弱。

这种情况下的解决方案是使用 ruby​​ 的本机环境变量支持。

$ GHREPO=ecx ruby -rjson -e 'j = JSON.parse($stdin.read); puts j["ChgSub"][ENV["GHREPO"]][0]["Major"].to_s' < dummy.json
0

为了使这一点更清楚,我将使用定界符,而不是引用的参数:

$ export GHREPO=ecx
$ ruby -rjson - dummy.json <<'EOF'
> j = JSON.parse(File.read(ARGV[0]))
> puts j["ChgSub"][ENV["GHREPO"]][0]["Major"].to_s
> EOF
0

使用定界符,您不再需要与在双引号内嵌入单引号、转义等进行斗争。

答案3

应该是'"'$GHREPO'"' 这样,命令是

cat dummy.json | ruby -rjson -e 'j = JSON.parse($stdin.read);
   puts j["ChgSub"]['"'$GHREPO'"'][0]["Major"].to_s'

@Etan 非常接近答案。

相关内容