Como podemos evitar a expansão de parâmetros?

1

Como podemos evitar a expansão de parâmetros? O Manual do Bash menciona isso em algum lugar? Eu apreciaria     se você pudesse me ajudar a localizar onde é mencionado lá.

Por exemplo,

$ b=1
$ echo $b
1

Quando o intérprete bash interpreta echo $b , a expansão do parâmetro $b acontece antes de executar echo $b . Portanto, não há necessidade de tornar b uma variável de ambiente do processo do shell, a fim de ser passada para o subprocesso de echo $b .

Para comparação, considere outro exemplo no link

$ b=1
$ c=$(b=2; echo $b)
$ echo $c
2

No shell original, quando o intérprete bash interpreta c=$(b=2; echo $b) , ele não expande $b usando o valor 1 .

No subshell da substituição de comandos, quando o intérprete bash interpreta b=2; echo $b , ele expande $b usando o valor 2 .

O que impede a expansão do parâmetro $b no shell original e deixa a expansão do parâmetro $b até a subshell?

As cotações podem impedir expansões de parâmetros, por exemplo %código%. Mas aqui não há cotações em torno da expansão do parâmetro. A substituição de comandos impede a expansão de parâmetros?

    
por Tim 11.02.2016 / 19:35

1 resposta

3

Você confundiu, as aspas duplas "$b" não impedem a expansão dos parâmetros, isso impede a expansão do nome do caminho (aka globbing) e divisão de campos .

Se você quiser evitar a expansão de parâmetros, use citando , como orçamento simples '$b' ou escapando \$b :

$ echo '$b'

ou:

$ echo \$b

então $b é literal de saída.

No exemplo, nada impede a expansão dos parâmetros.

Quando o shell lê a entrada c=$(b=2; echo $b) , ele executa o reconhecimento de token , viu que $( é token para substituição de comando. Então, ele trata o resto da string entre $( e ) a ser interpretado em subshell criado por substituição de comando, não pelo shell atual.

    
por 12.02.2016 / 10:04

Tags