
$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'
これは3つの隣接する別々の引用文字列です。
'j = JSON.parse($stdin.read); puts j["ChgSub"]["'
そして
"$GHREPO"
そして
'"][0]["Major"].to_s'
答え2
可能であれば、常に言語を混在させないようにしてください。この例では、シェルスクリプトを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は答えに非常に近いです。