
Quero fazer eco de uma variável com espaços em um arquivo de texto.
a=a\ b\ c
echo $a > /tmp/a
O resultado acima resulta em um arquivo dentro a b c
dele. E se eu precisar que o arquivo seja lido a\ b\ c
?
Eu tentei printf %q $a
, mas isso também não parece fazer o que eu quero.
Nota: Suponha também que eu não produzo o conteúdo que $a
é passado para mim fora do meu controle. Eu só preciso ter certeza de que ele foi salvo com espaços de escape.
Responder1
Barras invertidas escapam do próximo caractere; no seu caso, você escapou do espaço, ponto em que o conteúdo de $a
se torna: a b c
. Se você quiser que o conteúdo de $a tenha barras invertidas, você precisará escapar delas:
a=a\\\ b\\\ c
ou
a='a\ b\ c'
Se $a já contém texto com espaços e você deseja salvá-lo em um arquivo, simplesmente:
printf "%q" "$a" > /tmp/a
Quando você correu:
printf "%q" $a > /tmp/a
Você disse ao printf para citar3pedaços de texto divididos e agrupados: a
, b
, e c
, dos quais ele obedientemente escapou (não fazendo nada) antes de ser redirecionado para /tmp/a como abc
.
Faça uma boa leitura:Por que meu script de shell engasga com espaços em branco ou outros caracteres especiais?para ver o que está acontecendo.
Responder2
Basta colocá-lo entre aspas.
a="a\ b\ c"
Alternativamente, escape da fuga.
a=a\\\ b\\\ c
Ambos acabam com o mesmo resultado.
Responder3
Solução baseada no feedback de Jeff:
echo $a | sed -e "s/ /\\\ /g" > /tmp/a