Они существуют из-за истории. В этом руководстве говорится, что declare
было введено в bash
версии 2, local
было представлено ранее. Люди используют local
, export
и readonly
по договоренности и удобочитаемости.
Когда я вижу local
, я думаю - «Ох! Это должна быть локальная переменная функции. Я должен читать функцию. Когда я вижу declare
, мне нужно прокрутить вверх, пока я не увижу объявление функции, чтобы узнать, нахожусь ли я в функции, и посмотреть, является ли переменная локальной.
С export
, export
является встроенным POSIX, поэтому он будет работать везде, что важно. Но это похоже. Когда я вижу export
, я думаю: «Ох! Эта переменная экспортируется! Когда я вижу declare -x
, мне нужно обновить память с помощью параметров declare
(ну, это просто, -x
звучит как export
, но это еще одна вещь, которую нужно запомнить). Я предпочитаю писать local
и export
. Потому что именно так они и думают - эта переменная является локальной, эта переменная экспортируется.
Когда я читаю сценарии только с local
и export
, без использования declare
, я знаю, что это простой сценарий. declare -i
или declare -n
могут усложнить ситуацию.
Также, typeset
и declare
являются точными синонимами. Итак, вы также можете спросить, почему declare
, когда вы можете typeset
? Возможно, было введено typeset
, поэтому вы можете запускать ksh
скрипты, используя bash
без каких-либо изменений. То же самое с ключевыми словами local
и readonly
. Аналогично с mapfile
и readarray
. Конвенция. С файлом вы можете пойти с mapfile
, но со строкой здесь я иногда с readarray
, потому что я читаю некоторые данные в массив, а не отображаю файл.
Я считаю, что ключевое слово local
(немного?) Более переносимо, чем declare
. Вы могли бы прочитать экс. этот поток unix.stackexchange для получения дополнительной информации.