Ошибка команды при назначении переменной Bash - PullRequest
461 голосов
/ 15 февраля 2010

У меня есть этот скрипт с именем 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. И да, Bash находится в /bin/bash.

Ответы [ 5 ]

841 голосов
/ 15 февраля 2010

Нельзя ставить пробелы вокруг знака '='.

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

STR = "foo"

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

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

STR =foo

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

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

STR= foo

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

Я не уверен, поможет ли это прояснить ситуацию или это просто запутывание, но учтите, что:

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

В соответствующем разделе спецификации языка sh, раздел 2.9.1 , указано:

«Простая команда» - это последовательность необязательных присвоений и перенаправлений переменных, в любой последовательности, за которыми могут следовать слова и перенаправления, оканчивающиеся оператором управления.

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

152 голосов
/ 15 февраля 2010

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

#!/bin/bash 
STR="Hello World" 
echo $STR 
5 голосов
/ 26 февраля 2010

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

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

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

Команда 'str' не найдена

0 голосов
/ 27 марта 2019

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

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

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

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

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

0 голосов
/ 19 июня 2017

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

* 1003 Е.Г. *

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

Удалите пробелы:

name="Stack Overflow" 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...