cat-redirect um arquivo, mas com expansões variáveis

3

Eu tenho o arquivo ~/nginx_app contendo este modelo conf:

server {
    root /var/www/html/${domain}/;
    server_name ${domain} www.${domain};
}

Eu também tenho este script:

#!/bin/bash
domain="$1" && test -z ${domain} && return
cat ~/myAddons/nginx_app > /etc/sites-available/${domain}.conf

Como você pode ver, desejo redirecionar o conteúdo de nginx_app para ${domain}.conf , que o script cria com base no modelo.

Agora, é necessário que as variáveis dentro do modelo sejam expandidas, quando ocorrer o redirecionamento cat . Como você prometeria que a expansão realmente ocorrerá?

Eu estava pensando aqui, mas sei que imprime uma string:

cat > "etc/nginx/sites-available/${domain}.conf" <<< "source ~/myAddons/nginx_app"

E também disso

cat ~/myAddons/nginx_app > etc/nginx/sites-available/${domain}.conf

Atualizar

Depois de executar o script, o estado final deve /etc/sites-available/example.com.conf :

server {
    root /var/www/html/example.com/;
    server_name example.com www.example.com;
}
    
por user9303970 05.02.2018 / 01:30

2 respostas

2

O que você quer fazer é basicamente a substituição de strings para processar o conteúdo do arquivo de entrada, não a expansão da variável (embora isso seja executado pelo shell quando você faz referência à variável, mas não é o que faz no conteúdo da entrada). p>

Isso pode ser feito com sed , e a variável shell pode ser usada, apesar de consultar esta resposta para possível problemas.

#!/bin/sh
test -n "$1" || exit 1
sed 's/\${domain}/'"$1"'/g' input.txt > output_"$1".txt

Ajuste input e output de acordo. Observe também que eu uso o parâmetro $1 posicional diretamente, em vez de copiá-lo para a variável.

Se eu puder sugerir uma abordagem melhor seria ter um script que funcione como modelo, e você só forneça variáveis como parâmetros posicionais para a linha de comando do script ou por meio do fornecimento de um arquivo de variáveis. Copiar arquivos e executar acrobacias com a substituição de strings, especialmente se os padrões se tornarem complexos, não é a melhor abordagem.

    
por 05.02.2018 / 06:51
0

O que eu comecei a trabalhar (editado por comentários de StephenHarris) é:

domain=aa ; sed s"/\$domain/$domain/" ~/nginx_app >> ${domain}.conf

O segundo $domain do comando sed expande para aa no meu caso de teste. No entanto, como o primeiro $domain tem seu identificador $ com escape, ele NÃO é expandido.

Existe outro programa de linha de comando chamado awk que tem uma maneira mais poderosa de passar variáveis de fora para dentro dele, mas sed é considerado mais rápido e eficiente (não tenho certeza se realmente é verdade hoje em dia), então é por isso que eu respondi com sed porque esse era um caso simples. Em awk , você poderia usar:

awk -v domain=aa '{gsub("\$domain",domain);print}' ~/nginx_app >> ${domain}.conf

Aqui, a opção -v para awk define uma variável awk e gsub é uma função awk para executar uma substituição global para uma determinada linha. A seqüência de escape \ é ligeiramente maior que a da solução sed .

    
por 05.02.2018 / 02:22