Como posso escrever texto em um arquivo no bash enquanto mantém seu conteúdo anterior? [duplicado]

2

Eu tenho tentado criar um script de shell Bash que criaria e alteraria um arquivo chamado list . Efetivamente, meu objetivo com o programa é acrescentar nomes a uma lista, criando o arquivo com um cabeçalho (se necessário).

No entanto, o script falha atualmente em um ponto específico: Sempre que eu executo o script novamente, o nome antigo desaparece e é substituído pelo nome que acabou de ser inserido. Como posso resolver isso?

Meu script:

#!/bin/bash
#Please sign your name here.

echo "Hi, what's your name?"
read name
echo "Hi $name, welcome to the Linux course!"

echo Course Attendees > list
echo $name >> list

Exemplo de problema:

$ bash list.sh
Hi, what's your name?
Test
Hi Test, welcome to the Linux course!

$ cat list
Course Attendees
Test

$ bash list.sh
Hi, what's your name?
Test2
Hi Test, welcome to the Linux course!

$ cat list
Course Attendees
Test2
    
por Mike02x 30.12.2016 / 21:40

1 resposta

4

No Bash, existem duas maneiras de gravar em um arquivo (tecnicamente, há muito mais, mas para todos os efeitos desta resposta, existem dois):

Primeiro, é o operador > , como você está usando nesta linha:

echo Course Attendees > list

O operador > irá sobrescrever qualquer coisa existente no arquivo com o novo conteúdo do arquivo. Na verdade, ele exclui o arquivo e cria um novo com o mesmo nome.

Em segundo lugar, o operador >> , como usado aqui:

echo $name >> list

Isso adicionará linhas a um arquivo existente, ou criará um novo caso ele não exista.

Quando você executa seu script, sempre sobrescreve sua lista de cursos com o cabeçalho "Participantes do curso", causando esse erro. Altere seu programa para anexar apenas linhas se o cabeçalho "Participantes do curso" estiver presente. Minha sugestão pessoal seria verificar se o arquivo existe. Em caso afirmativo, use apenas a operação de acréscimo. Caso contrário, dê o cabeçalho e crie-o.

Ou, mais elegantemente, execute somente echo Course Attendees > list se o arquivo não existir. Veja esta resposta SO para mais informações sobre como executar uma verificação como esta.

    
por Kaz Wolfe 30.12.2016 / 21:45