在 echo 中组合参数参数

在 echo 中组合参数参数

我使用以下脚本在我的环境中执行以下操作:

  1. 创建 Nginx 站点配置。
  2. 创建相应的 Let'sEncrypt SSL 证书。
  3. sites-default在我的目录和站点配置之间创建符号链接。
  4. 重新启动服务器。

我的代码:

#!/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.

我想如何以及为什么改进这段代码:

在长排井号的地方,我想插入以下命令:

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

添加此命令会将脚本更改为执行 5 个步骤,而不是 4 个:

  1. 创建 Nginx 站点配置。
  2. 创建相应的 Let'sEncrypt SSL 证书。
  3. sites-default在我的目录和站点配置之间创建符号链接。
  4. 添加仅适用于本地主机的所有特权且经过身份验证的数据库用户,并具有相同名称的数据库。
  5. 重新启动服务器。

我的问题:

正如你所看到的,我${DOMAIN}在里面使用了我的参数echo.我这样做是因为我必须在那里也传递相同的参数,否则,数据库用户名及其关联的数据库都不适合我的站点配置,并且我的基于 Wordpress 的站点将无法启动。

这个操作在 Bash 中合乎逻辑吗?或者您会采取另一种方法?

为了澄清这一点,我要求了解当参数位于echo.

答案1

您无需执行以下操作即可做到这一点echo

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

并查看主题为什么 printf 比 echo 更好?

答案2

听起来你要问的是Bash 参数替换。这echo命令在这里不起作用。看起来你正在使用单引号代替双引号,这会抑制字符串中的参数替换。只需使用双引号而不是单引号,并使用反斜杠转义要包含在字符串中的任何双引号,例如:

echo "create database ${DOMAIN}; create user \"${DOMAIN}\"@\"localhost\" identified by \"mypassword\"; grant all privileges on ${DOMAIN}.* to ${DOMAIN};"

相关内容