인용된 문자열에서 환경 변수를 구문 분석하는 방법은 무엇입니까?

인용된 문자열에서 환경 변수를 구문 분석하는 방법은 무엇입니까?

$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

가능하면 항상 언어를 혼합하는 것을 피해야 합니다. 이 예에서는 쉘 스크립트를 루비 스크립트에 혼합하려고 합니다. 언어를 혼합하면 코드가 복잡해지고 취약해집니다.

이 경우 해결책은 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은 답변에 매우 가깝습니다.

관련 정보