Eu tenho um arquivo ao qual quero anexar algum conteúdo (incluindo o primeiro, segundo e terceiro espaços vazios visíveis no meu código abaixo):
### Eu sou o texto 1 ### Eu sou o texto 2
(O texto real que anexo é muito maior do que essas 5 linhas).
Para simplesmente anexar conteúdo a um arquivo, eu faço:
cat <<-"EOF" >> myPath/myFile
content...
EOF
Mas como eu poderia garantir que o heredocument acrescentaria o conteúdo apenas se o conteúdo ainda não existir em um arquivo e que, caso contrário, a operação seria abortada?
Se apenas parte do conteúdo do bloco já existir no arquivo, toda a operação também deve ser abortada.
Se o documento aqui só deve ser adicionado se nenhum estiver presente, você pode usar
grep
:Para entender isso, considere o seguinte.
grep -F -q -f myPath/myFile{.append,}
é expandido pelo shell paragrep -F -q -f myPath/myFile.append myPath/myFile
.O
grep
comando procuramyPath/myFile
(o arquivo ao qual o texto deve ser adicionado se necessário) por qualquer string fixa (-F
) contida nomyPath/myFile.append
(arquivo que contém o texto a ser adicionado), lendo um padrão por linha (-f
), e indica se encontra algum apenas por seu código de saída , sem saída (-q
).O resultado é então negado
!
, para que a parteif
do blocothen
só seja executada segrep
não encontrar nada.Por favor, não mande para cima esta resposta, mas a de Stephen, que marquei como correta. Esta é apenas uma variação mais fácil para mim ler.
Se o conteúdo do arquivo de modelo só deve ser anexado ao arquivo final se nenhum deles já estiver presente no arquivo final, você pode usar
grep
:O
grep
comando procuramyPath/endFile.sh
por qualquer string fixa (-F
) contida emmyPath/myTemplate
, lendo um padrão por linha (-f
), e indica se encontra alguma apenas pelo seu código de saída , sem saída (-q
).O resultado é então negado
!
, de modo que othen
bloco doif-then
bloco só será executado segrep
não corresponder a nada no arquivo final.Apêndice - códigos de saída:
Quando um processo sai, ele retorna um código de saída, que é um pequeno inteiro. Por convenção, um código de saída 0 indica sucesso, diferente de zero indica falha ou erro:
grep
retorna 0 quando encontra uma correspondência e 1 se não encontrar.if
usa o código de saída de seu argumento para decidir o que fazer; se 0, processa othen
bloco, caso contrário, oelse
bloco (se houver).Uma pontuação (
!
) inverte isso; Othen
bloco só é executado se o grep não corresponder a nada (ou encontrar um erro).