引用符付き文字列から環境変数を解析する方法は?

引用符付き文字列から環境変数を解析する方法は?

$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は答えに非常に近いです。

関連情報