Инициирование динамических переменных (переменных переменных) в скрипте оболочки bash - PullRequest
2 голосов
/ 08 декабря 2010

Я использую PHP CLI через оболочку bash. Пожалуйста, проверьте Управление массивом (напечатанным php-cli) в скрипте оболочки для получения подробной информации.

В следующем коде оболочки я могу отобразить пары key - value, которые я получаю из сценария PHP.

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 фона. Я хотел бы что-то вроде $$key = $val PHP

Ответы [ 2 ]

4 голосов
/ 08 декабря 2010

Использование 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 предотвращает создание подоболочки. Установка IFS только для команды read устраняет необходимость сохранять и восстанавливать ее значение.

3 голосов
/ 08 декабря 2010

Вы можете попробовать использовать конструкцию 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

Затем просто используйте ее в цикле.


РЕДАКТИРОВАТЬ:этот цикл чтения создает вложенную оболочку , которая не позволит вам использовать их вне цикла.Вы можете реструктурировать цикл чтения так, чтобы не создавалась вложенная оболочка:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...