在bash shell脚本中启动dynamicvariables(variablesvariables)

我通过bash shell使用PHP CLI。 请检查在shell脚本中操作数组(由php-cli打印)以获取详细信息。

在下面的shell代码中,我能够回显我从PHP脚本获得的key对。

 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循环中启动dynamicvariables,这样我可以像$BASE_PATH那样使用它们,其值为'/path/to/project/root'$db_host 'localhost'

我来自PHP的背景。 我想要的东西像$$key = $val的PHP

Solutions Collecting From Web of "在bash shell脚本中启动dynamicvariables(variablesvariables)"

您可以尝试在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 。 您可能重构读取循环,以便不创建子外壳:

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

使用进程替换<()并将其重定向到while循环的done可以防止创建子shell。 仅将IFS设置为read命令,不需要保存和恢复其值。