Expandindo uma variável contendo um sinal de igual e chaves

1

Estou escrevendo um script que usa rsync e exclui arquivos com base em determinadas configurações. Acabo com um sinalizador de exclusão que tem um formato de --exclude={foo, bar, baz} .

No entanto, ao tentar expandi-lo dentro do comando rsync , notei que o sinalizador está com escape. Do depurador básico, posso ver meu comando de rsync $excludes se tornar rsync '--exclude={foo,bar,baz}' , em vez do esperado rsync --exclude={foo,bar,baz} . Ao fazer alguns testes, descobri que qualquer string contendo = , { ou } será agrupada em aspas simples quando expandida. Curta de usar eval em uma string construída, há uma maneira de contornar isso?

    
por ollien 04.07.2018 / 16:23

2 respostas

2

A expansão de contraventamento não ocorrerá quando for citada. Você também deve armazenar argumentos em uma matriz em vez de uma variável (quando possível).

Acho que o seguinte deve funcionar para você:

excludes=( $(--exclude={foo,bar,baz}) )
rsync "${excludes[@]}"
    
por 04.07.2018 / 16:46
1

From the bash debugger, ... any string containing =, {, or } will get wrapped in single quotes when expanded.

Se você quer dizer xtrace output ( set -x ), ele realmente gosta de exibir argumentos entre aspas simples quando eles contêm caracteres especiais. A saída está em um formato que seria utilizável como entrada para o shell.

Isso não significa que as aspas sejam parte da string, no entanto.

Compare:

$ echo abc def\ ghi
+ echo abc 'def ghi'
abc def ghi

$ echo abc \'def\ ghi\'
+ echo abc ''\''def ghi'\'''
abc 'def ghi'

Embora, até onde eu saiba, não se preocupe em citar cadeias contendo o sinal de igual.

    
por 04.07.2018 / 19:25

Tags