Script de shell: como escrever conteúdo com várias linhas no arquivo, se o arquivo não existir?

9

Preciso criar o arquivo /opt/nginx/conf.d/default.confcom este conteúdo via shell script e criar o arquivo se ele não existir:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /usr/share/nginx/html;
}

Como escrevo conteúdo de várias linhas por meio de um script de shell?

Eu criei o diretório

sudo mkdir -p /opt/nginx/conf.d

Mas não sei escrever um arquivo.

user3142695
fonte
1
você pode usar> (para substituir o arquivo) ou >> (para acrescentar, se ele já existir). exemplo: echo "hello world"> file.txt
Rob
é todo o texto estático ou qualquer parte dele deve ser substituída por um valor dinâmico? (por exemplo, nome do host, porta, diretório raiz, etc.)
Jeff Schaller
Acabei de editar sua pergunta para esclarecer, mas posso ter entendido errado o que você queria. Deseja adicionar o conteúdo ao arquivo, mesmo que ele já exista , ou deseja apenas criar o arquivo se ele não existir? O que deve acontecer se o arquivo já existir?
terdon

Respostas:

13

resumo: use >>para acrescentar, use [ -f file ]para testar.

tentar

if [ ! -f myfile ]
then
   cat <<EOF > myfile
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name $server ;
    root /usr/share/nginx/html;
}
EOF
fi
  • a sintaxe cat <<EOFé chamada de " documento aqui ".
  • $server será substituído por seu valor ou vazio se não definido.
  • conforme indicado, você pode usar aspas simples 'EOF'para evitar a substituição de var, se houver.
  • você também pode ter vários ecos (isso pode ser doloroso de manter se houver muitos ecos)

    echo "## foo.conf" > foo.conf
    echo param1=hello >> foo.conf
    echo param2=world >> foo.conf
    

anexado

não há prefpend direto no bash, use o arquivo temporário

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

ou edite

sed -i -e '1r new_file' -e 'wq' file
Archemar
fonte
Como eu acrescentaria um conteúdo de várias linhas a um arquivo?
user3142695
1
Outra mudança sensata a fazer seria a de citar as cordas limite aqui-doc, de modo que quaisquer palavras que contêm $(se houver) não são tratados como variáveis e, portanto, não se expandiu
Inian
@ user3142695 O mais fácil seria escrever o documento aqui em um arquivo separado e depois catos dois arquivos juntos e renomear o resultado.
Kusalananda
Se alguém quiser fazer muitos echos separados , ainda é mais eficiente ter apenas um redirecionamento, colocando-os em um bloco: { echo "foo"; echo "bar"; echo "baz"; } >file- dessa forma, não abriremos novamente filetoda vez que quisermos escrever uma única linha para ele, e fechá-lo quando essa linha estiver concluída.
Charles Duffy
Outro bom uso do documento aqui:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051
3

Se o arquivo /opt/nginx/conf.d/default.conf não existir, imprima (f) a sequência estática no arquivo:

[ -f /opt/nginx/conf.d/default.conf ] || printf 'server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n    server_name _;\n    root /usr/share/nginx/html;\n}\n' > /opt/nginx/conf.d/default.conf
Jeff Schaller
fonte
1
Eu consideraria printf '%s\n' "first line" "second line"talvez um pouco mais legível; dessa forma não é necessário para ler a seqüência inteira para descobrir onde os escapes são ..
Charles Duffy