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

36

Exemplo simplificado, com falha:

FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2

Eu preciso incluir as aspas como se o comando fosse assim:

rsync --archive --exclude="foo bar.txt" dir1 dir2
    
por Reilly Beacom 24.11.2011 / 06:11

3 respostas

44

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

Resposta longa: Colocar comandos (ou partes de comandos) em variáveis e depois recuperá-las intactas é complicado. Quando o shell expande uma variável na linha de comando, se a variável estiver entre aspas duplas, ela não será analisada; se não estiver entre aspas, os espaços serão analisados como quebras de argumentos, mas aspas e escape não serão analisadas. Em ambos os casos, colocar aspas no valor da variável não faz nada útil.

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

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
    
por 24.11.2011 / 07:38
2

eval é outra opção:

$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b

Veja também:

por 05.07.2015 / 10:26
-1

Eu não vejo o problema:

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

Talvez seja necessário citar novamente o valor:

$ rsync "$FLAGS" dir1 dir2
    
por 24.11.2011 / 18:49

Tags