我很难获取$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 非常接近答案。