Ошибка команды при назначении переменной Bash
У меня есть этот скрипт с именем test.sh:
#!/bin/bash
STR = "Hello World"
echo $STR
когда я бегу sh test.sh
Я получаю это:
test.sh: line 2: STR: command not found
Что я делаю неправильно? Я смотрю на очень простые / начинающие учебники по bash-скриптингу онлайн, и вот как они говорят об объявлении переменных... Так что я не уверен, что делаю неправильно.
Я на Ubuntu Server 9.10. И да, Баш находится на /bin/bash
,
7 ответов
Вы не можете иметь пробелы вокруг знака "=".
Когда вы пишете:
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
не является присвоением переменной.
Оставьте пробелы вокруг =
знак:
#!/bin/bash
STR="Hello World"
echo $STR
В интерактивном режиме все выглядит отлично
$ str="Hello World"
$ echo $str
Hello World
Очевидно! как сказал Йоханнес, вокруг '=' нет места. Если вокруг '=' есть пробел, то в интерактивном режиме он выдает ошибки как `
Команда 'str' не найдена
Я знаю, что на это ответили очень качественным ответом. Но, короче говоря, у вас не может быть пробелов.
#!/bin/bash
STR = "Hello World"
echo $STR
Не работал из-за пробелов вокруг знака равенства. Если бы ты бежал...
#!/bin/bash
STR="Hello World"
echo $STR
Это будет работать
Когда вы определяете какую-либо переменную, вам не нужно вводить лишние пробелы.
Например
name = "Stack Overflow"
// it is not valid, you will get an error saying- "Command not found"
Итак, удалите пробелы:
name="Stack Overflow"
и это будет работать нормально.
Чтобы добавить к принятому ответу: использование тире в имени переменной приведет к той же ошибке. Удалять-
чтобы избавиться от ошибки.
STR-STR="Hello World"
bash: STR-STR=Hello World: command not found
У меня точно такая же проблема, но это не синтаксическая ошибка. Вот простой скрипт:
#!/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.