У меня есть этот 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 user@server <<-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.