Не все переменные оболочки помечены как экспортированные, как вы можете видеть в выводе declare -p
.
Нет смысла для bash
помечать $_
как экспортируемую, потому что это автоматически добавляет эту переменную в окружение дочерних процессов , но с другим значением, чем то, которое она имеет в оболочка (в этот момент ).
Отображение его как экспортированного просто запутает пользователя в отношении того, что произойдет со средой внешних команд.
Все "переменные времени выполнения" BASH*
не экспортируются.
Это можно сделать, используя ссылки на имена или косвенные переменные, но вам следует использовать ассоциативные массивы. Нет необходимости в переменных для каждой записи, когда для всего набора подойдет ассоциативный массив.
declare -A books
books[buffa7]="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books[giancoli6]="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"
Тогда:
read input
source=${books[$input]} # set $source to entry from array
if [[ -z $source ]] # if $source is empty after that
then # $input was not in array, so
source=$input # set $source to $input.
fi