it-swarm.com.ru

Ошибка команды при назначении переменной 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. И да, bash находится по адресу /bin/bash.

461
Jake Wilson

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

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

STR = "foo"

bash пытается запустить команду с именем STR с двумя аргументами (строки '=' и '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 не является присвоением переменной.

841
William Pursell

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

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

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

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

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

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

5
Arkapravo

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

Например.

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

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

name="Stack Overflow" 

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

0
Ravi Solanki

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

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

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

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

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

0
Derek Haber