Здравствуй, мой дорогой, уважаемый друг!


У меня возникили трудности при написании скрипта на shell, я так сильно привык к bash, что немного вошел в ступор и надеюсь на твою помощь.


Задача


Имеем:


export APP_NAME='test'
export APP_DESCRIPTION='Test app'
export APP_VERSION='beta'
export APP_COMMIT_HASH='000000000'
# и черт пойми еще какие APP_* могут быть
export PROJECT_DIR='./src'


На bash-е сделал так:


#!/bin/bash
for k in ${!APP_*}; do
grep -q "^$k" "$PROJECT_DIR/.env" && \
sed "s|^$k=.*|$k=${!k}|" || \
printf '%s=%s\n' "$k" "${!k}" >> "$PROJECT_DIR/.env"
done


Очень нужно перенести на shell, там где это будет работать - товарищ майор запрещает использовать bash. На скорую руку сделал так:


#!/bin/sh
vars=$(env | grep -o '^APP_.*=' | tr -d '=')
for k in $vars; do
eval "v=$k"
grep -q "^$k" "$PROJECT_DIR/.env" && \
sed "s|^$k=.*|$k=$v|" || \
printf '%s=%s\n' "$k" "$v" >> "$PROJECT_DIR/.env"
done


Проблема



  • eval == зло

  • сложное получение списка названий переменных


Изящный способ то существует?


Скорее всего env и eval можно заменить на set, но решил спросить у тебя, может быть подскажешь что-то более практически и эстетически верное.


Спасибо.







 , ,






URL записи