Ошибка команды при назначении переменной Bash

465

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

  • 30
    Я рад, что вы задали этот вопрос, вы не единственный новичок от bash!
  • 3
    Спасибо, что задали этот вопрос. Это не вопрос, который нужно смущать. Я работаю допоздна в офисе, и вокруг меня нет эксперта по Bash, который мог бы ответить на этот вопрос.
Показать ещё 3 комментария
Теги:
sh
syntax
variable-assignment

6 ответов

861
Лучший ответ

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

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

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 не является присваиванием переменной.

  • 0
    Если у вас есть переменная с именем, которое связывается с "-", происходит такая же ошибка. В этом случае решение состоит в том, чтобы удалить «-»
  • 0
    chomp @ В правиле 7b раздела 2.10.10 pubs.opengroup.org/onlinepubs/9699919799 «Если все символы, предшествующие« = », образуют правильное имя (см. Имя XBD), должен быть возвращен токен ASSIGNMENT_WORD». Перейдя по ссылке на раздел 3.231 pubs.opengroup.org/onlinepubs/9699919799 , мы находим «В языке команд оболочки слово, состоящее исключительно из символов подчеркивания, цифр и алфавитов из переносимого набора символов. Первый символ имени не цифра ". Таким образом, слово FOO-BAR=qux не является присваиванием переменной, поскольку FOO-BAR не является допустимым именем.
Показать ещё 2 комментария
155

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

#!/bin/bash 
STR="Hello World" 
echo $STR 
  • 7
    Это забавно, так как set foo = bar является распространенной ошибкой и в пакетных файлах Windows - и там для него высмеивают язык пакетной обработки ;-)
  • 0
    Спасибо @joey. Я застрял в написании сценария оболочки, где я инициализировал переменные с пробелами после «=». Ты спас мой день
Показать ещё 1 комментарий
5

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

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

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

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

  • 2
    Но обратите внимание, что ОП говорил STR = "Hello World" , поэтому этот ответ здесь не применим.
  • 0
    @Arkapravo, что означает интерактивный режим, имеет ли он какое-то отношение к $ mark
Показать ещё 1 комментарий
0

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

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

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

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

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

0

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

например.

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

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

name="Stack Overflow" 

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

-1

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

#!/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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню