Script de shell: Como posso escrever conteúdo de várias linhas em um arquivo se o arquivo não existir?

8

Eu preciso criar o arquivo /opt/nginx/conf.d/default.conf com este conteúdo via script de shell 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 multilinha 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.

    
por user3142695 04.10.2017 / 15:54

2 respostas

12
Resumo de

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

tente

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 " aqui documento ".
  • $server será substituído pelo seu valor ou vazio se não for definido.
  • como apontado, você pode usar o único citado 'EOF' para evitar a substituição do var, se houver.
  • você também pode ter vários ecos (isso pode ser difícil de manter se houver muitos ecos)

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

prefixando

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

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

ou edite-o

sed -i -e '1r new_file' -e 'wq' file
    
por 04.10.2017 / 15:59
3

Se o arquivo /opt/nginx/conf.d/default.conf não existir, então imprima (f) a string 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
    
por 04.10.2017 / 16:16