Como analisar a variável env em uma string entre aspas?

2

Estou com dificuldades para obter o valor de uma variável de ambiente ( $GHREPO ) em uma string entre aspas. Aqui está o comando que estou executando. Eu estou tentando fazer um diretório com o valor de j["ChgSub"][$GHREPO][0]["Major"] , $ GHREPO sendo uma variável de ambiente.

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

Editar: conteúdo dummy.json

{

  "ChgSub": {
    "ecx": [
      {
        "Major": 0,
        "Minor": 0,
        "Patch": 3
      }
    ]
  }
}
    
por themihai 26.11.2014 / 23:49

3 respostas

3

Variáveis não são avaliadas em uma única string entre aspas. Você precisa usar aspas duplas. Se você não pode ou não quer usar aspas duplas para toda a string, você pode usá-las apenas para essa parte da string.

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

São três strings entre aspas separadas, uma ao lado da outra.

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

e

"$GHREPO"

e

'"][0]["Major"].to_s'
    
por 27.11.2014 / 00:14
2

Você deve sempre evitar misturar idiomas o máximo possível. Neste caso, você está tentando misturar o shell script no script ruby. A mistura de idiomas convolua seu código e o torna frágil.

A solução neste caso é usar o suporte à variável de ambiente nativo do ruby.

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

Para tornar isso ainda mais claro, eu usaria um heredoc e não um argumento citado:

$ 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

Usando um heredoc, você não precisa mais lutar com a inclusão de aspas simples entre aspas duplas, escape, etc.

    
por 27.11.2014 / 06:09
0

Deve ser '"'$GHREPO'"' , então o comando é

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

@Etan estava bem perto da resposta.

    
por 27.11.2014 / 01:49