Como faço para ecoar um colchetes JSON vazios como um valor padrão?

11

Não consigo obter um% JSON {} vazio para fazer eco se um envvar estiver ausente. Ou tenho um } à direita na saída, se definido, ou o escape é exibido.

bash-3.2$ unset X
bash-3.2$ echo "${X:-{}}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-{}}"
y}
bash-3.2$ echo "${X:-{\}}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-{\}}"
{\}
bash-3.2$ echo "${X:-'{}'}"
'{}'
bash-3.2$ X=z
bash-3.2$ echo "${X:-'{}'}"
z

Como faço para escapar corretamente?

    
por Nick T 31.10.2017 / 23:33

3 respostas

14

Cite suas chaves:

bash-3.2$ echo "${X:-"{}"}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-"{}"}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-"{}"}"
{}

Cotações internas são necessárias aqui, o que parece engraçado, mas está sintaticamente bem.

Aspas simples não funcionam, e não sei por que não. Esta é uma citação aninhada real, não final e retomada, que você pode verificar colocando espaços. O dobro funcionará bem.

    
por 31.10.2017 / 23:45
9

Você pode trapacear e definir uma variável como o resultado vazio e evitar os problemas de cotação

$ def="{}"
$ echo ${X:-$def}
{}
$ X=y
$ echo ${X:-$def}
y
$ unset X
$ echo ${X:-$def}
{}
$ 
    
por 01.11.2017 / 00:23
5

O que faço frequentemente é usar valores hexadecimais para caracteres através de printf :

bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
{}
bash-4.3$ X="something"
bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
something

Um pouco detalhado, mas funciona sem muita ênfase nas citações.

    
por 01.11.2017 / 05:55

Tags