processamento de metacaracteres para valor padrão na expansão de variáveis

0

Quando um valor padrão é fornecido para uma expansão de variável (por exemplo, ${varname-default} ), como os caracteres que compõem default devem ser interpretados?

Ingenuamente, eu teria imaginado que substituição de variável (por exemplo, $ b) e expansão de caracteres semelhantes a citações ' , " , \ ocorreria nesse contexto ... mas parece que a expansão de caracteres de citação nem sempre ocorrem.

Por exemplo,

> echo x${a-''}y
xy

mas

> echo x"${a-''}"y 
x''y

Eu esperava xy em ambos os casos, pois a construção que expande variáveis como ${a-$PATH} e ( BRACE='}'; echo ${a-$BRACE} ) funciona bem.

No entanto, GNU bash, version 4.4.19(1)-release e ... a versão mais recente de mksh têm o mesmo comportamento em que '' é incluído literalmente na saída do segundo exemplo.

    
por Gregory Nisbet 17.08.2018 / 05:22

1 resposta

1

A expansão ${parameter:-[word]} está sujeita a várias expansões:

De homem bash :

In each of the cases below, word is subject to tilde expansion, parameter expansion, command substitution, and arithmetic expansion.

De especificação POSIX :

word shall be subjected to tilde expansion, parameter expansion, command substitution, and arithmetic expansion.

Ambos relatam o mesmo e ambos não incluem "remoção de cotação".

As aspas são removidas após a expansão de toda a variável já foi feita. No entanto, é difícil mostrar exatamente como isso é feito:

$ sh
$ unset b
$ set -x
+ set -x
$ echo 1 ${b-e}
+ echo 1 e
1 e
$ echo 2 ${b-"e"}
+ echo 2 e
2 e
$ echo 3 ${b-'e'}
+ echo 3 e
3 e
$ echo 4 "${b-e}"
+ echo 4 e
4 e
$ echo 5 "${b-"e"}"
+ echo 5 e
5 e
$ echo 6 "${b-'e'}"
+ echo 6 'e'
6 'e'
$ set +x
+ set +x

Ou:

$ $ set -x; echo 1 x${b-e}y; echo 2 x${b-"e"}y; echo 3 x${b-'e'}y; echo 4 "x${b-e}y"; echo 5 "x${b-"e"}y"; echo 6 "x${b-'e'}y"; set +x
+ echo 1 xey
1 xey
+ echo 2 xey
2 xey
+ echo 3 xey
3 xey
+ echo 4 xey
4 xey
+ echo 5 xey
5 xey
+ echo 6 x'e'y
6 x'e'y
+ set +x
$ 
    
por 17.08.2018 / 06:48

Tags