Здравствуй, мой дорогой, уважаемый друг!
У меня возникили трудности при написании скрипта на 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 -i "s|^$k=.*|$k=${!k}|" "$PROJECT_DIR/.env" || \
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 -i "s|^$k=.*|$k=$v|" "$PROJECT_DIR/.env" || \
printf '%s=%s\n' "$k" "$v" >> "$PROJECT_DIR/.env"
done
Проблема
eval
== зло- сложное получение списка названий переменных
Изящный способ то существует?
Скорее всего env
и eval
можно заменить на set
, но решил спросить у тебя, может быть подскажешь что-то более практически и эстетически верное.
Решение
Всем спасибо за помощь!
Пока оставил в таком виде:
#!/bin/sh
cat /proc/self/environ | tr -d '\n' | tr '\0' '\n' | \
grep '^APP_[a-zA-Z0-9_-]*=.*$' | \
while IFS='=' read -r k v; do
grep -q "^$k" "$PROJECT_DIR/.env" && \
sed -i "s|^$k=.*|$k=\"$v\"|" "$PROJECT_DIR/.env" || \
printf '%s="%s"\n' "$k" "$v" >> "$PROJECT_DIR/.env"
done