首页 > 解决方案 > Bash:未正确使用/定义变量

问题描述

处理我的自动安装脚本。它没有正确使用我的变量,调试日志看起来像这样。

我尝试了几种变体,使用“”而不是“”,不使用“”或“”,而只是使用 $variable。脚本如下所示:

echo "Creating Apache2 VHost and Wordpress blog $domain"

VAR1=$sitealias
VAR2=$domain
MOREF=$`pwgen 14 1`
echo $MOREF is SQL password.

mkdir /var/www/"$domain"
chown -R www-data:www-data /var/www/"$domain"
echo "<VirtualHost *:80>
    ServerName myblog.example.com

    ServerAdmin webmaster@example.com
    DocumentRoot /usr/share/wordpress

    Alias /wp-content /var/lib/wordpress/wp-content
    <Directory /usr/share/wordpress>
        Options FollowSymLinks
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php
        Require all granted
    </Directory>
    <Directory /var/lib/wordpress/wp-content>
        Options FollowSymLinks
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
" > /etc/apache2/sites-available/$domain.conf

mysqladmin -u root password supersecretpassword create wp_$sitealias
mysqladmin -u root password supersecretpassword CREATE USER     $sitealias@'localhost' IDENTIFIED BY '$MOREF';
mysqladmin -u root password supersecretpassword GRANT ALL PRIVILEGES ON   wp_'$sitealias.'* TO '$sitealias'@localhost;
FLUSH PRIVILEGES;
quit         

该脚本应在命令、文件夹目录中插入变量。相反,该变量只是被忽略,如调试日志中所示。

更新:

变量捕获现在工作正常。但是,SQL 不喜欢您的双引号(复制并粘贴它们)

root@hosting:/bin# hello.sh letstest.tld testtesttdjsuqwu
Creating Apache2 VHost and Wordpress blog 
qui2AenaihoQu9 is SQL password.
mysqladmin: Unknown command: 'create wp_testtesttdjsuqwu'
mysqladmin: Unknown command: 'CREATE USER   'testtesttdjsuqwu'@'localhost' IDENTIFIED BY 'q'
mysqladmin: Unknown command: 'GRANT ALL PRIVILEGES ON wp_testtesttdjsuqwu.*  TO 'testtesttd'
/bin/hello.sh: line 37: FLUSH: command not found
/bin/hello.sh: line 38: quit: command not found

标签: bashdebian

解决方案


如果你想在你的脚本中使用参数(基于上面的注释,'domain' 和 'sitealias')使用 '$1' '$2' 来捕获它们

domain=$1
sitealias=$2
# Fixed quoting of pwgen)
MOREF=$(pwgen 14 1)
# Rest of the script here, using $domain, $sitealias
echo $MOREF is SQL password.

mkdir /var/www/"$domain"

目前尚不完全清楚您想要“APACHE_LOG_DIR”的值是多少。假设需要在运行时解析此变量,基于 Apache 默认值,您希望在“echo”语句中使用单引号而不是双引号。这将推迟该变量的解析。

echo '<VirtualHost *:80>
    ServerName myblog.example.com

    ServerAdmin webmaster@example.com
    DocumentRoot /usr/share/wordpress

    # Lines removed for

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
' > /etc/apache2/sites-available/$domain.conf

此外,请考虑对 mysqladmin setup 命令使用双引号。使用双引号启用变量替换,mysql 需要时使用单引号。

mysqladmin -u root password supersecretpassword "create wp_$sitealias"
mysqladmin -u root password supersecretpassword "CREATE USER  '$sitealias'@'localhost' IDENTIFIED BY '$MOREF'";
mysqladmin -u root password supersecretpassword "GRANT ALL PRIVILEGES ON wp_$sitealias.* TO '$sitealias'@'localhost';"
FLUSH PRIVILEGES;
quit   

推荐阅读