bash - 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
解决方案
如果你想在你的脚本中使用参数(基于上面的注释,'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
推荐阅读
- c - 如何解决“在非结构或联合的情况下请求成员‘等级’”?
- c - 同一个C程序的三个版本,为什么第一个这么快?
- java - 当 url 不匹配时,匹配 driver.getcurrenturl () 和预期 url 报告的断言通过
- electron - 防止 Electron App 附加到控制台窗口
- android-studio - Android Studio statvfs
- java - 覆盖函数未更新全局变量
- java - 按 ID 查找元素无法识别 - Selenium
- symfony - 反序列化时自动合并相关项
- javascript - 通过原型继承扩展 ES2015
- python - 打印一个列表并从每个新行中删除 '\n',给出错误