Инициализируйте переменные на лету, преобразованные с помощью sed - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу использовать переменные, определенные в .yml в сценарии оболочки. Переменная в yaml имеет вид variable: value. Внутри скрипта я пытаюсь:

sed 's/\s*:\s*/=/' *vars.yml*  
echo $variable

Но echo ничего не возвращает. Это способ выполнения такой операции в сценарии оболочки?

Ответы [ 3 ]

1 голос
/ 25 февраля 2020
eval `sed 's/\s*:\s*/=/' *vars.yml*`
echo $variable
0 голосов
/ 26 февраля 2020

Не могли бы вы попробовать следующее:

while IFS= read -r line; do
    declare "$(sed 's/[[:blank:]]*:[[:blank:]]*/=/' <<< "$line")"
done < file.yml

echo "$var1"
echo "$var2"

file.yml:

var1: value1
var2: value2

Вывод:

value1
value2

[Объяснение]

  • while l oop с read читает входной файл file.yml построчно, присваивая переменную line каждой записи.
  • Синтаксис declare var=value создает переменную с именем var, затем присваивает ее value. Команда declare принимает не только буквальное присваивание, но и выражение, которое оценивается как присваивание. В этом случае команда sed преобразует строку var1: value1 в var1=value1, затем declare выполняет присваивание.
  • В общем случае не рекомендуется использовать eval , если у вас нет полного и исключительного контроля над входным файлом из-за потенциальной угрозы безопасности. Представьте, что какой-то злой парень добавляет в файл строку rm -rf ~/, и он eval редактируется, не зная об этом. Использование declare должно быть менее рискованным, чем eval.
0 голосов
/ 25 февраля 2020

Источник вывода вашей команды, например

$cat vars.yml
var1: value1
var2: value2
var3: value3
$ cat 1.sh
source <(sed 's/\s*:\s*/=/' *vars.yml*)
echo $var1
echo $var2
echo $var3

output:

value1
value2
value3
...