Двойная подстановка переменных в bash

Прежде всего, команда POSIX source команда будет исходными файлами только из каталогов в PATH . Чтобы обойти это, вам нужно будет использовать полный путь:

sh ./env-changes ./dummy-env-script.sh

Кроме того, переносимая версия источника - это . :

. "$1"

Тогда конструкция не является POSIX, поэтому вам нужно будет обойти это. Например, вы можете использовать временные файлы:

tmp1=$(mktemp)
tmp2=$(mktemp)
env | sort > "$tmp1"
. "$1"
env | sort > "$tmp2"
diff "$tmp1" "$tmp2"
rm  "$tmp1" "$tmp2"

Или другой подход:

ENV_BEFORE=$(env)
. "$1"
ENV_AFTER=$(env)
printf -- '%s\n%s\n' "$ENV_BEFORE" "$ENV_AFTER" | sort | uniq -u

Здесь мы печатаем обе переменные, сортируем их, передаем через uniq -u , который выводит только уникальные строки, печать только новой переменной:

$ sh ./env-changes ./dummy-env-script.sh 
I_AM_NEW=hello

4
27.05.2016, 19:53
2 ответа

Вы можете сделать это с помощью перенаправления

for progs in ${list[@]}; do
     a="${progs}_MIN_REQ"
     b="${progs}_CURR"
     echo "$progs: ${!a}:${!b}"
done
5
27.01.2020, 20:53
for progs in "${list[@]}"; do
  eval 'echo "$progs: ${'"${progs}"'_MIN_REQ}:${'"${progs}"'_CURR}"'
done
1
27.01.2020, 20:53

Теги

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