在bash shell脚本中启动动态变量(变量变量)
问题描述:
我通过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
答
您可以尝试使用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
答
使用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可消除保存和恢复其值的需要。
@Martin谢谢,这有效,但在while循环之外有可变范围问题。我能够在循环内的eval行后面回显变量,但不在“while”循环的`done`关键字之外 – 2010-12-08 07:54:25
您是对的,这是因为read构造创建了一个子外壳。然后内部变量在循环之外将不可见。我会更新与替代解决方案的答案... – 2010-12-08 08:10:39