Como uso uma variável Bash (string) contendo aspas em um comando?


Respostas:


55

Resposta curta: consulte BashFAQ # 50 ("Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!").

Resposta longa: Colocar comandos (ou partes de comandos) em variáveis ​​e depois recuperá-los intactos é complicado. Quando o shell expande uma variável na linha de comando, se a variável estiver entre aspas duplas, ela não é analisada; se não estava entre aspas, os espaços são analisados ​​como quebras de argumento, mas as aspas e escape não são analisados. Em qualquer um dos casos, colocar aspas no valor da variável não é útil.

Geralmente, a melhor maneira de fazer esse tipo de coisa é usar uma matriz em vez de uma variável de texto simples:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

Santo Jezus, funciona!
Slawomir


-2

Eu não vejo o problema :

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

Talvez você precise citar novamente o valor:

$ rsync "$FLAGS" dir1 dir2

5
echonão está mostrando o que você pensa que é. Tente printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"ver por que nenhuma dessas opções funciona.
Gordon Davisson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.