Echo ponto e vírgula no bash

0

Estou tentando gravar em um arquivo a seguinte string: 1;2;3;4 . Os ponto-e-vírgulas criam problemas.

Eu consegui descobrir o seguinte ecamotage para fazer isso:

variable='1;2;3;4'
echo "${variable//;/\;}" >output.file

no entanto, se for executado pelo crontab por alguma razão, ele não produz o arquivo de saída, ele só funciona se executado manualmente.

Qualquer alternativa ao meu código?

    
por giovi321 19.06.2016 / 14:44

1 resposta

4

Existem dois problemas aqui. Primeiro, se você quiser substituir ; por \; , será necessário escapar do \ . Lembre-se que \ é um caractere especial, ele é usado para escapar de coisas (isto é, presumivelmente, precisamente porque você deseja adicioná-lo antes do ; ). Para usá-lo literalmente, em uma substituição, você precisa escapar também:

$ variable='1;2;3;4'
$ echo "${variable//;/\;}"  ## fails
1;2;3;4
$ echo "${variable//;/\;}" ## works
1\;2\;3\;4

A próxima questão é que, como apontou Cuonglm, o cron roda tudo com /bin/sh . Dependendo do seu sistema, isso pode ser um bash rodando no modo de compatibilidade sh, ou outro shell mínimo ( dash em sistemas baseados no Debian) ou até mesmo o próprio shell de bourne. Portanto, é bem provável que a construção ${var//foo/bar} não funcione. Por exemplo, em dash :

$ variable='1;2;3;4'
$ echo "${variable//;/\;}"
dash: 2: Bad substitution

No entanto, se tudo o que você deseja é imprimir uma string salva em uma variável em um arquivo, isso deve sempre funcionar:

variable='1;2;3;4'
printf '%s\n' "$variable" > file
    
por 19.06.2016 / 16:26