Expansão de parâmetro

1

Estou brincando com a expansão de parâmetros. O seguinte é o meu código.

a="one"
sh -c 'echo $a'

b="two"
sh -c "echo $b"

c="three" sh -c 'echo $c'
echo $c

E esta é a saída quando eu executo este script:

$sh test.sh

two
three

$

Por $ a, se a cotação única suprimir a substituição. Não deveria imprimir apenas o echo $ a? Está imprimindo uma nova linha, isso significa que o valor de $ a é nulo? Para $ c, o 'echo $ c' não funciona, não imprime uma nova linha, mas o echo $ c na próxima linha funciona como planejado. Estou um pouco confuso como isso funciona.

    
por Subhaa Chandar 05.01.2017 / 22:30

2 respostas

0

Se você quiser ver variáveis em subprocessos, precisará export deles. Assim:

   $ export a=7
   $ sh -c 'echo $a'
   7

No seu caso, subprocessos (por a e b ) não vêem variáveis do shell pai.

Quando você cria uma string com aspas simples, todas as substituições não funcionam. Você não pode substituir variável ou algo como \n . Será exatamente $a ou \n . Então, string no primeiro caso é exatamente 'echo $ a'. sh -c 'echo $a' criará um novo processo, e esse processo não terá o pai $a , ele terá seu próprio% não inicializado$a, i. e. seqüência vazia. Será apenas a execução de 'echo $a'

No segundo caso, você está usando aspas duplas. A substituição funciona e a sequência torna-se "echo two" antes do subprocesso de execução. Então, é apenas a execução sh -c 'echo two' .

No terceiro caso, $c se torna variável exportada. É uma sintaxe especial que significa «variável de exportação apenas para este comando». Assim, você executa exatamente sh -c 'echo $c' , mas o novo shell conterá $c como uma variável de ambiente. Como $PATH ou $HOME quando você inicia seu shell.

    
por 05.01.2017 / 22:47
4

sh -c 'echo $a' é como abrir um novo shell e digitar echo $a nele. Como não há variável a no shell filho (você não usou export do que você definiu no shell pai), ele imprimirá uma linha vazia.

com

b="two"
sh -c "echo $b"

, a string "echo $b" é expandida pelo shell atual e o valor expandido é passado como uma string de argumento para o escudo de criança. É como se você abrisse um novo shell e digitasse echo two .

var=val command temporariamente define e export s var=val , apenas para a invocação de command .

c="three" sh -c 'echo $c'

é quase (a subshell não está realmente lá) como

( export c="three"; sh -c 'echo $c' )

A variável c no shell pai não é afetada.

    
por 05.01.2017 / 22:42

Tags