Есть ли преимущество / недостаток инициализации значения переменной bash в скрипте, либо перед основным кодом, либо перед локальными переменными в функции перед присвоением ей фактического значения?
Мне нужно сделать что-то вроде этого:
init()
{
name=""
name=$1
}
init "Mark"
Есть ли риск того, что переменные будут инициализированы значениями мусора (если они не инициализированы) и это отрицательно скажется на значениях переменных?
name = ""; name = argv[1];
? И разве это не так бессмысленно?Ответы:
Нет смысла присваивать переменную пустую строку, а затем немедленно назначать ей другую переменную строку. Присвоение значения переменной оболочки полностью перезапишет его предыдущее значение.
Насколько мне известно, нет рекомендаций, согласно которым вы должны явно инициализировать переменные для пустых строк. Фактически, это может маскировать ошибки при некоторых обстоятельствах (ошибки, которые в противном случае были бы очевидны при работе
set -u
, см. Ниже).Неустановленная переменная, которая не используется с момента запуска скрипта или явно сбрасывается при запуске
unset
команды, не будет иметь значения. Значение такой переменной будет ничем. Если использовать как"$myvariable"
, вы получите эквивалент""
, и вы никогда не получите «мусорные данные».Если параметр оболочки
nounset
установлен с помощью либо,set -o nounset
либоset -u
, то ссылка на неустановленную переменную вызовет ошибку оболочки (и неинтерактивная оболочка прекратит работу):или в
bash
:Переменные оболочки будут инициализированы средой, если имя переменной соответствует существующей переменной среды.
Если вы ожидаете, что используете переменную, которая может быть инициализирована средой таким образом (и если она нежелательна), то вы можете явно сбросить ее перед основной частью вашего скрипта:
который также удалит его как переменную среды, или вы можете просто проигнорировать его начальное значение и просто перезаписать его присваиванием (что также приведет к изменению значения переменной среды).
Вы никогда не встретите неинициализированный мусор в переменной оболочки (если, как указано, мусор уже существует в переменной окружения с тем же именем).
источник
unset
ting) перед запуском какого-for
либоwhile
цикла или цикла, чтобы установить его на вычисляемый значение, если есть вероятность того, что цикл фактически не запустится из-за невыполнения условия; и переменная могла быть установлена в другое значение в среде, унаследованной сценарием. Но, возможно, лучше поместить все в amain()
и определить переменные какlocal
.:
, например,${myvariable-defaultvalue}
Изменить : К сожалению, очевидно, объявление отличается от инициализации. Я все равно оставлю это здесь, чтобы начинающие программисты, такие как я, могли учиться на своей ошибке.
Преимущество объявления локальных переменных в функции заключается в том, что вы можете легко скопировать код.
Например, скажем, у меня есть функция:
Если я хочу превратить его в скрипт, я просто игнорирую это
local
утверждение и копирую все остальное:Если бы объявление и присвоение были в одной строке, мне пришлось бы вручную отредактировать
local
деталь, прежде чем я мог бы превратить ее в скрипт:В этом примере это не имеет большого значения, но если вы имеете дело с большими и более сложными функциями, это может стать более болезненным.
источник