2017-02-08 6 views
0

Я пытаюсь получить значения некоторых php-переменных в сценарии bash, чтобы установить другие переменные bash. В основном мне нужно иметь доступ к значению имени переменной - переменной.Как использовать имена переменных переменных в сценарии bash

сценарий может найти & прочитать файл, найти переменные php, но когда я пытаюсь установить их, он просто зависает. Вот что у меня есть:

variables=(database_user database_password dbase); 

paths=(modx_core_path modx_connectors_path modx_manager_path modx_base_path); 

for index in "${variables[@]}"; do 
index=\$$index 
echo $index; 
$index="$(grep -oE '\$${!index} = .*;' $config | tail -1 | sed 's/$${!index} = //g;s/;//g')"; 
done 

не уверен, что я делаю неправильно здесь ...

+0

@ 123, пожалуйста, не предлагайте ABS в качестве ссылки; это довольно печально для демонстрации плохих практик. [BashFAQ # 6] (http://mywiki.wooledge.org/BashFAQ/006) - это гораздо более современное и активно поддерживаемое обсуждение косвенных переменных. –

ответ

1

Вы пытаетесь выполнить косвенное назначение.

Вы должны избавиться от этих двух линий:

index=\$$index 
echo $index; 

Просто писать:

echo "${!index}" 

Что делает косвенную расширение чисто (дает значение переменной, имя которой содержится в переменная index).

Далее, проблематично линия это:

$index="$(grep -oE '\$${!index} = .*;' ... (rest omitted) 

В Bash, задание не может начинаться с $.

Один из способов выполнить косвенное назначение заключается в следующем (после удаления index повторного назначения, как было предложено выше):

printf -v "$index" "$(grep -oE '\$${!index} = .*;' ... (rest omitted) 

Это использует -v варианта printf, который вызывает значение, переданное в качестве окончательного аргумент, назначаемый переменной, имя которой передается в опцию -v.

Существуют и другие способы обработки косвенных присвоений/расширений, некоторые из которых связаны с рисками ввода кода, поскольку они используют (потенциально неконтролируемые) данные в качестве кода. Это то, что вы, возможно, захотите исследовать дальше.

Обратите внимание, что я принимаю действительные команды замены grep (я не тестировал).

Смежные вопросы