Нельзя ставить пробелы вокруг знака '='.
Когда вы пишете:
STR = "foo"
bash пытается запустить команду с именем STR с 2 аргументами (строки '=' и 'foo')
Когда вы пишете:
STR =foo
bash пытается запустить команду с именем STR с 1 аргументом (строка '= foo')
Когда вы пишете:
STR= foo
bash пытается запустить команду foo с STR, установленным в пустую строку в своем окружении.
Я не уверен, поможет ли это прояснить ситуацию или это просто запутывание, но учтите, что:
- первая команда в точности эквивалентна:
STR "=" "foo"
,
- второй такой же как
STR "=foo"
,
- и последний эквивалентен
STR="" foo
.
В соответствующем разделе спецификации языка sh, раздел 2.9.1 , указано:
«Простая команда» - это последовательность необязательных присвоений и перенаправлений переменных, в любой последовательности, за которыми могут следовать слова и перенаправления, оканчивающиеся оператором управления.
В этом контексте word
- это команда, которую собирается запустить bash. Любая строка, содержащая =
(в любой позиции, отличной от начала строки), которая не является перенаправлением, является присваиванием переменной, тогда как любая строка, которая не является перенаправлением и не содержит =
, является командой. В STR = "foo"
, STR
не является присвоением переменной.