Первый метод является более распространенным, так проще для других Понимаю.
В большинстве случаев, когда используется переменная среды ($ ORACLE_HOME, $ JAVA, ..), она не установлена в командной строке, а некоторое время ранее и используется разными скриптами. Поэтому, когда вы считаете, что ваш var должен быть частью конфигурации, использование переменной среды (как значения по умолчанию) прекрасное.
В других случаях я бы использовал параметры.
Как насчет необходимости модифицировать скрипт:
# First script calling myprogram that uses ...
# Difficult to see, the vars name and lastname
name="John"
while read -r lastname; do
./myprogram
done < lastnames.txt
Теперь кто-то хочет изменить цикл и получить все пользователи с переменной окружения пользователя из базы данных.
name="John"
while read -r lastname; do
./myprogram
username="${lastname}" ~/bin/getdbusers
done < lastnames.txt
На этот раз вам повезло, то второй человек также использует вар username
и не подозревает о том, что ./myprogram
использует lastname
. Он соблазн ввести ошибку, изменив переменный цикл:
name="John"
while read -r username; do
./myprogram # Oops, this should have been changed into lastname=username ./myprogam
~/bin/getdbusers
~/bin/somethingWithUserName
done < lastnames.txt
Это Становится все труднее понять, какие программы использовать $ имени и другой ВАР.
Использование параметров облегчит понять и ошибки держали подальше:
name="John"
while read -r lastname; do
./myprogram "${name}" "${lastname}"
~/bin/getdbusers "${lastname}"
~/bin/somethingWithUserName "${lastname}"
done < lastnames.txt
Нет проблем, на самом деле. Эти два не взаимозаменяемы; ваш сценарий должен быть написан правильно, чтобы принять его. Единственным недостатком переменной среды по сравнению с параметром командной строки является то, что вы можете установить переменную среды в своей оболочке и забыть об этом. Ваша программа не знает и не заботится о том, как она была установлена, и вы можете поцарапать голову, когда './Myprogram' неожиданно работает так же, как' arg1 = 1./Myprogram'. Труднее случайно добавить параметр командной строки для вызова. – chepner