Combinando um argumento de parâmetro dentro de um echo [duplicado]

1

Eu uso o seguinte script para executar as seguintes ações no meu ambiente:

  1. Como criar um conf conf do site Nginx
  2. Criando um certificado SSL Let'sEncrypt correspondente.
  3. Como criar um link simbólico entre meu sites-default dir e meu site conf
  4. Reiniciando o servidor.

Meu código:

#!/bin/sh
for domain; do
    > "/etc/nginx/sites-available/${domain}.conf" cat <<EOF
        server {
            root /var/www/html/${DOMAIN};
            server_name ${DOMAIN} www.${DOMAIN};

            location ~ /\.ht {
                deny all;
            }

            location / {
                index index.php index.html index.htm fastcgi_index;
                try_files $uri $uri =404 $uri/ /index.php?$args;
            }

            location ~*  \.(jpg|jpeg|png|gif|ico|css|js|ttf|woff|pdf)$ {
                expires 365d;
            }

            location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
            }
        }
    EOF
    sudo ln -s /etc/nginx/sites-available/${domain} /etc/nginx/sites-enabled/
    #########################################################################
    certbot --nginx -d ${DOMAIN} -d www.${DOMAIN}
done
systemctl restart nginx.service # Create Webapp Substrate.

Como e por que quero melhorar este código:

Onde a longa fila de hashmarks, eu quero inserir o seguinte comando:

echo 'create database ${DOMAIN}; create user "${DOMAIN}"@"localhost" identified by "mypassword"; grant all privileges on ${DOMAIN}.* to ${DOMAIN};' | mysql -u root -p

Adicionar este comando mudará o script para fazer 5 passos em vez de 4:

  1. Cria um conf conf do site Nginx.
  2. Cria um certificado SSL Let'sEncrypt correspondente.
  3. Como criar um link simbólico entre meu sites-default dir e meu site conf
  4. Adicionando um usuário de banco de dados totalmente privilegiado e autenticado adequado apenas para localhost, com um banco de dados com o mesmo nome.
  5. Reiniciando o servidor.

Minha pergunta:

Como você pode ver, usei meu parâmetro ${DOMAIN} dentro do echo . Eu fiz isso porque eu deve passar o mesmo argumento lá também, caso contrário, o nome de usuário do banco de dados e seu banco de dados associado não caberão no meu site e meu site baseado no Wordpress não inicializará.

Esta operação é lógica no Bash ou você tomaria outra abordagem?

Para esclarecer, peço para entender se passar argumentos baseados em parâmetros é válido quando o parâmetro está dentro de um echo .

    
por Arcticooling 07.11.2017 / 02:14

2 respostas

3

Você pode fazer isso sem echo :

mysql -u root -ppass <<EOF
  create database ${DOMAIN};
  create user "${DOMAIN}"@"localhost" identified by "mypassword";
  grant all privileges on ${DOMAIN}.* to ${DOMAIN};
EOF

E veja o tópico Por que o printf é melhor que o eco?

    
por 07.11.2017 / 07:54
2

Parece que o que você está perguntando é Substituição de parâmetro Bash . O comando echo não desempenha um papel aqui. Parece que você está usando aspas simples em vez de double-quotes , que suprime a substituição de parâmetros na string. Basta usar aspas duplas em vez de aspas simples e usar barras invertidas para evitar as aspas duplas que você deseja incluir na string, por exemplo:

echo "create database ${DOMAIN}; create user \"${DOMAIN}\"@\"localhost\" identified by \"mypassword\"; grant all privileges on ${DOMAIN}.* to ${DOMAIN};"
    
por 07.11.2017 / 02:19