script bash que incorpora o conteúdo de um arquivo como parte de um comando

1

Estou tentando montar o que eu acho que poderia ser chamado de script bash (não que minhas habilidades de script basque sejam algo para se gabar). O que eu estou tentando fazer é alimentar uma linha de um arquivo de texto - um arquivo de texto cujo conteúdo muda regularmente - para um programa que estou invocando (imagemagick). Até agora está funcionando, mas somente se houver uma única palavra ou sequência numérica no arquivo de texto - acho que estou tentando usar um for loop, e o loop de alguma forma resulta no espaço em branco sendo tratado como quebras de linha . Assim, quando o conteúdo do arquivo excede uma palavra ou sequência numeral, em vez de o conteúdo do arquivo ser alimentado para o programa como uma linha de texto, parece que ele é alimentado com uma linha por vez e somente a última linha: praticamente uma única palavra - é incorporada no final no resultado. Não é o que eu quero.

Vou dar um exemplo usando echo, pois acho que isso será mais simples de demonstrar e entender dessa maneira. Então eu tenho um arquivo de texto, e digamos que é chamado myfile.txt . Ele contém uma única linha com várias palavras e sequências numéricas. Pode parecer o seguinte:

'Sep 09, 2016 - 01:00 PM EDT\nconditions: mostly cloudy\n34 F\nHumidity: 39%'

As aspas simples devem receber o programa para o qual estou alimentando esse material para tratá-lo como um todo e ignorar o espaço em branco. Os \ n bits são necessários para o programa que estou alimentando, e eles funcionam nesse programa como indicadores de quebra de linha. Então, usando este exemplo com um loop for e o comando echo, uma linha como a seguinte

for i in 'cat myfile.txt'; do echo $i; done

produz saída não

'Sep 09, 2016 - 01:00 PM EDT\nconditions: mostly cloudy\n34 F\nHumidity: 39%'

mas

'Sep
09,
2016
-
01:00
PM
EDT\nconditions:
mostly
cloudy\n34
F\nHumidity:
39%'

Pelo que estou lendo, parece que usar um loop que invoca cat não é uma maneira muito boa de realizar o que eu estou procurando, e que o loop pode ser a causa do conteúdo acabar espalhado por vários linhas ao invés de todos juntos. Então, alguém pode sugerir uma maneira de fazer isso que fará com que todas essas palavras e grupos inteiros acabem na mesma linha?

PS: O script que estou tentando criar começa com #!/bin/bash e consiste em uma série de comandos. Ele faz o download de um arquivo de texto do qual a maior parte do conteúdo é excluída e é renomeada para myfile.txt . Depois disso, faz o download de um mapa meteorológico e executa algumas operações nele (principalmente corte). A ideia é usar o imagemagick para justapor algum texto no mapa / imagem. Na verdade, ele já está funcionando, desde que eu não tente incluir várias palavras ou sequências inteiras divididas pelo espaço em branco. Se eu exceder uma única palavra ou sequência inteira no arquivo de texto, somente a última palavra ou sequência inteira será justaposta na imagem.

    
por MJiller 10.08.2016 / 05:40

2 respostas

3

Eu acho que você está tentando processar algum texto usando o Imagemagick. Em caso afirmativo, por que não dizer

convert -background lightblue -fill blue -font Helvetica -size 160x  label:"$(<input.txt)" output.gif

onde input.txt é o arquivo que você deseja renderizar.

    
por 10.08.2016 / 09:03
2
while read -r things; do
  printf "%s\n" "$things"
done <myfile.txt

Se você se encontrar escrevendo for i in $( cat ... , pare e mude para while read -r i e insira os dados em done . Não há motivo para fazer slurp no conteúdo do arquivo inteiro apenas para passar por cima dele e, em alguns contextos (dados grandes), você terá muitos problemas.

O -r sinalizador para read fará com que read gerencie as barras invertidas corretamente.

Também estou usando printf em vez de echo . Por quê? Veja aqui .

Eu também estou citando minhas variáveis. Por quê? Veja aqui .

    
por 10.08.2016 / 08:46

Tags