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.


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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.