Сценарий Bash не интерпретирует переменную внутри переменной

Местонахождение My Co -Хост вытащил сервер и переустановил все модули DIMM.

Этого не было уже 3 дня. Может показаться, что по мере того, как соединение замедляется из-за отсутствия надежного соединения, все больше и больше данных становятся поврежденными, пока система не выйдет из строя, пытаясь пропустить неверные адреса. Плохое соединение также могло привести к падению напряжения памяти, вызывая колебания. Напряжения оставались в пределах диапазона, но становились неустойчивыми, когда это начиналось.

3
19.03.2021, 14:34
2 ответа

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

Обычной традицией является использование подобных файлов конфигурации в качестве реального сценария оболочки, поэтому (аналогично файлам в Debian /etc/default), поэтому файл будет

DIR="${HOME}/test/tmp"

и вы бы прочитали это с

. configfile

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

Другой возможностью было бы запустить файл через envsubst, например.с файлом в вашем вопросе envsubst < configfileвыведет:

DIR = "/home/me/test/tmp"

или вы можете использовать envsubst '$HOME $OTHER $VARS', чтобы расширить некоторые конкретные.

Обратите внимание, что в отличие от сценария оболочки, envsubstне считывает никаких назначений из входного файла. Например. значение ROOTPATH, используемое во второй строке, является тем, которое envsubstполучает из среды, оно не имеет ничего общего с «назначением» в первой строке:

ROOTPATH=/something/$USER
LOGPATH=$ROOTPATH/logs
10
28.04.2021, 22:58

Это излишне сложный способ получить то, что вам нужно! Все, что вам нужно, это (Я также изменил имена переменных на строчные, пожалуйста, избегайте использования CAPS для переменных сценария оболочки, поскольку они используются для переменных среды, и это может привести к конфликтам имен):

testvar="$(grep -oP '^DIR\s*=\s*"\K[^"]+' /home/user/path/to/file.conf)"

Это доставит вам testvar=${HOME}/test/tmp. Чтобы расширить $HOME, теперь вам нужно оценить его:

testvar=$(eval echo "$testvar")

Однако использование evalдля произвольного кода очень опасно. Если файл, который вы читаете, содержит команду, эта команда будет выполнена. Таким образом, подходы, приведенные в ответе @ilkkachu , намного лучше и безопаснее.

3
28.04.2021, 22:58

Теги

Похожие вопросы