Ошибка команды при назначении переменной 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, установленным в пустую строку в своем окружении.

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

  1. первая команда в точности эквивалентна: STR "=" "foo",
  2. вторая такая же как STR "=foo",
  3. и последнее эквивалентно 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.
Другие вопросы по тегам