我通过bash shell使用PHP CLI。有关详细信息,请查看Manipulating an array (printed by php-cli) in shell script。
在下面的shell代码中,我能够回显我从PHP脚本获得的key
- value
对。
IFS=":"
# parse php script output by read command
php $PWD'/test.php' | while read -r key val; do
echo $key":"$val
done
以下是此输出 -
BASE_PATH:/path/to/project/root
db_host:localhost
db_name:database
db_user:root
db_pass:root
现在我只想在while循环中启动动态变量,以便我可以使用$BASE_PATH
,其值为'/path/to/project/root'
,$db_host
为'localhost'
我来自PHP背景。我想要类似PHP的$$key = $val
答案 0 :(得分:4)
使用eval
会带来必须考虑的安全风险。使用declare
:
# parse php script output by read command
while IFS=: read -r key val; do
echo $key":"$val
declare $key=$val
done < <(php $PWD'/test.php')
如果您使用的是Bash 4,则可以使用关联数组:
declare -A some_array
# parse php script output by read command
while IFS=: read -r key val; do
echo $key":"$val
some_array[$key]=$val
done < <(php $PWD'/test.php')
使用进程替换<()
并将其重定向到done
循环的while
可防止创建子shell。仅为read
命令设置IFS消除了保存和恢复其值的需要。
答案 1 :(得分:3)
您可以尝试在 BASH :
中使用eval
构造
key="BASE_PATH"
value="/path/to/project/root"
# Assign $value to variable named "BASE_PATH"
eval ${key}="${value}"
# Now you have the variable named BASE_PATH you want
# This will get you output "/path/to/project/root"
echo $BASE_PATH
然后,只需在循环中使用它。
编辑:这个读取循环创建一个子shell ,它不允许你在循环之外使用它们。您可以重新构建读取循环,以便不创建子shell:
# get the PHP output to a variable
php_output=`php test.php`
# parse the variable in a loop without creating a sub-shell
IFS=":"
while read -r key val; do
eval ${key}="${val}"
done <<< "$php_output"
echo $BASE_PATH