Команда не обнаружила ошибку в присваивании переменной Bash

У меня есть этот script, называемый test.sh:

#!/bin/bash
STR = "Hello World"
echo $STR

когда я запускаю sh test.sh, я получаю следующее:

test.sh: line 2: STR: command not found

Что я делаю неправильно? Я смотрю на базовые/новички bash учебники по сценариям онлайн, и так они говорят, чтобы объявлять переменные... Поэтому я не уверен, что я делаю неправильно.

Я на сервере Ubuntu 9.10. И да, bash находится в /bin/bash.

Ответ 1

У вас не может быть пробелов вокруг знака "=".

Когда вы пишете:

STR = "foo"

bash пытается запустить команду с именем STR с двумя аргументами (строки '=' и 'foo')

Когда вы пишете:

STR =foo

bash пытается запустить команду с именем STR с 1 аргументом (строка '= foo')

Когда вы пишете:

STR= foo

bash пытается запустить команду foo с STR, установленным в пустую строку в своей среде.

Я не уверен, что это помогает прояснить или это просто обфускация, но обратите внимание:

  • первая команда в точности эквивалентна: STR "=" "foo",
  • вторая такая же, как STR "=foo",
  • а последнее эквивалентно STR="" foo.

Соответствующий раздел спецификации sh, раздел 2.9.1 гласит:

"Простая команда" представляет собой последовательность необязательных назначений переменных и перенаправления в любой последовательности, необязательно сопровождаемую словами и перенаправлениями, завершенными оператором управления.

В этом контексте a word - это команда, которую будет запускать bash. Любая строка, содержащая = (в любой позиции, отличной от начала строки), которая не является перенаправлением, является присвоением переменной, а любая строка, которая не является перенаправлением и не содержит =, является командой. В STR = "foo" STR не является присваиванием переменной.

Ответ 2

Оставьте пробелы вокруг знака =:

#!/bin/bash 
STR="Hello World" 
echo $STR 

Ответ 3

В интерактивном режиме все выглядит нормально

$ str="Hello World"
$ echo $str
Hello World

Очевидно! как сказал Йоханнес, нет места вокруг '='. В случае, если есть какое-либо пространство вокруг '=', то в интерактивном режиме он дает ошибки как `

Нет команды 'str' found

Ответ 4

Когда вы определяете любую переменную, вам не нужно вставлять лишние пробелы.

например.

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"

Итак, удалите пробелы:

name="Stack Overflow" 

и он будет работать нормально.

Ответ 5

Я знаю, что на это ответили очень качественным ответом. Но, короче говоря, у вас не может быть пробелов.

#!/bin/bash
STR = "Hello World"
echo $STR

Не работал из-за пробелов вокруг знака равенства. Если бы вы должны были бежать...

#!/bin/bash
STR="Hello World"
echo $STR

Это будет работать

Ответ 6

У меня точно такая же проблема, но это не синтаксическая ошибка. Вот простой скрипт:

#!/bin/bash
ssh -T [email protected] <<-EOSSH
  VAR1=test
  cd $VAR1
EOSSH

это выводит следующие ошибки, где я полагаю, что первые два являются договорными:

Warning: no access to tty (Bad file number).
Thus no job control in this shell.
VAR1=test: Command not found.