在bash shell脚本中启动动态变量(变量变量)

时间:2010-12-08 07:25:43

标签: linux bash shell variables

我通过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

2 个答案:

答案 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