我正在尝试使用 bash 从 php 配置文件中读取一些变量,它在大多数情况下都在工作,但我在尝试使用传回的值时遇到问题。
可变变量可以在配置中找到,但是当它被传回时,它仍然有来自PHP的单引号或双引号。
这是我正在使用的。
DBPASS="$(grep -oE '$database_password = .*;' $CONFIG | tail -1 | sed 's/$database_password = //g;s/;//g')"
现在,变量可以括在单引号或双引号中,并且密码字段中可能存在单引号。 所以我不能把它们都去掉。
知道怎么做吗?
更新
因此,换句话说,我在bash脚本(基本上备份CMS(中添加了一些内容,该脚本将查找并编写一个小的PHP"助手"。该助手将只读取配置,构建一个数组并将其传递回 bash 脚本。
HELPER="backup-helper.php";
CONFIG="../core/config/config.inc.php"
if [ ! -f "$HELPER" ]; then
echo '<?php' >> $HELPER;
echo '$config = "$argv[1]";' >> $HELPER;
echo 'include_once($config);' >> $HELPER;
echo 'echo $dbase;' >> $HELPER;
echo 'echo $modx_core_path;' >> $HELPER;
echo 'return "this";' >> $HELPER;
chmod 755 $HELPER;
php $HELPER $CONFIG;
fi
所以这基本上只是寻找辅助文件并创建它,如果它不存在,然后运行它进行测试 - 这一切都有效。
我可以轻松地添加逻辑以从配置文件中创建我需要的数组,但是:
如何格式化它(要传回的数组(以便 bash 能够理解它? 如何将其(数组(传回 bash?(基本上我如何告诉 bash 期望返回值?
如果你觉得幸运的话,可以这样:
eval $(sed -Ene '/^$database_(username|password)/{s/ = /=/;s/^$//;s/;$//;p;}' config.php)
我只想在这里说,你绝对不应该这样做,这是一个坏主意,我只是作为一个反例。如果你写这样的 shell 脚本,你最终会搬起石头砸自己的脚。
这样的东西会更安全:
db_username="$(php -r 'include("config.php"); print $database_username;')"
db_password="$(php -r 'include("config.php"); print $database_password;')"
当然,这取决于有一个PHP解释器来处理PHP脚本的读取和解析。如果这是不可能的,那么你就冒着以不完全符合 PHP 解释 PHP 脚本的方式编写基于 shell 的 PHP 解释器的风险。买家当心,可能含有坚果等。
你可以做一些非常丑陋的事情,比如这样:
#!/usr/bin/env bash
shopt -s extglob
while read -r line; do
#echo "line = $line"
case "$line" in
'$database_username = '*|'$database_password = '*)
output="${line#$database_+([[:alpha:]]) = }"
output="${output#"}" # strip leading double quote
output="${output%";}" # strip trailing double quote and semicolon
;;
esac
case "$line" in
'$database_username = '*)
db_username="$output"
;;
'$database_password = '*)
db_password="$output"
;;
esac
done < config.php
printf 'u = %snp = %sn' "$db_username" "$db_password"
这具有无管道的优点,它的所有功能都是自包含的 bash 脚本。但是,如果您的配置.php包含尾随分号的空格,或分号前的空格,或行断开并继续使用转义换行符,或者使用诸如$database_password .= "MOAR";
之类的东西或任何其他可能完全有效的PHP的东西在多行上构建的变量,它就会中断。
我强烈喜欢二号门,使用PHP解释器来解释你的PHP。
更新
如果你的PHP配置在一个数组中(例如,与Drupal一样(,你可以导出该数组来bash,如下所示:
declare -A conf
while IFS== read -r -d '' key value; do
conf["$key"]="$value"
done < <( php -r 'include("config.php"); foreach ($conf as $key => $value) printf("%s=%s ",$key,$value);')'
这使用 bash 进程以 bash 的read
命令可以安全地读取的格式提供 PHP 数组的转储。如果你想从你的PHP配置中读取很多东西,并且你只想启动PHP一次,而不是你获取的每个值,这可能是有利的。
请注意,如果任何键包含等号,则可能需要调整此设置。此外,关联数组是 bash 4 的一个特性。