2010-12-08 304 views
2

我通过bash shell使用PHP CLI。详情请查询Manipulating an array (printed by php-cli) in shell script在bash shell脚本中启动动态变量(变量变量)

在下面的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

回答

3

您可以尝试使用eval结构中BASH

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 
+0

@Martin谢谢,这有效,但在while循环之外有可变范围问题。我能够在循环内的eval行后面回显变量,但不在“while”循环的`done`关键字之外 – 2010-12-08 07:54:25

+0

您是对的,这是因为read构造创建了一个子外壳。然后内部变量在循环之外将不可见。我会更新与替代解决方案的答案... – 2010-12-08 08:10:39

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') 

使用过程substition <()并重定向到while循环done防止创建的子壳。仅为read命令设置IFS可消除保存和恢复其值的需要。