Почему пространство в присваивании переменной дает ошибку в Bash?

#!/bin/bash declare -r NUM1=5 NUM2 =4 # Line 4 num3=$((NUM1 + NUM2)) num4=$((NUM1 - NUM2)) num5=$((NUM1 * NUM2)) num6=$((NUM1 / NUM2)) # Line 9 echo "$num3" echo $((5**2)) echo $((5%4)) 

Я использую этот сценарий bash, и когда я запускал скрипт, я получил ошибку

 ./bash_help ./bash_help: line 4: NUM2: command not found ./bash_help: line 9: NUM1 / NUM2: division by 0 (error token is "NUM2") 5 25 1 

Поэтому я изменил код на это, и ошибка исчезла.

 #!/bin/bash declare -r NUM1=5 NUM2=4 num3=$((NUM1 + NUM2)) num4=$((NUM1 - NUM2)) num5=$((NUM1 * NUM2)) num6=$((NUM1 / NUM2)) echo "$num3" echo $((5**2)) echo $((5%4)) 

Почему мы не можем использовать пробелы, когда мы присваиваем значение переменной? Согласие использовать пробелы для лучшей читаемости кода. Может кто-нибудь объяснить это?

Это не соглашение в bash (или, в более общем плане, shellх семейства POSIX).

Что касается «почему», это потому, что различные способы сделать это не так, все имеют действительные значения в качестве команд. Если вы NUM2 = 4 задание, вы не можете передать = в качестве литерала без цитирования. Следовательно, любое такое изменение было бы несовместимым назад , а не помещением в неопределенное пространство (где расширения для стандарта POSIX sh должны жить, чтобы избежать нарушения этого стандарта).

 NUM2= 4 # runs "4" as a command, with the environment variable NUM2 set to an empty string NUM2 =4 # runs "NUM2" as a command, with "=4" as its argument NUM2 = 4 # runs "NUM2" as a command, with "=" as its first argument, and "4" as another 

В Bash функции передаются аргументами как разделенные пробелами слова.

Из документации

«Каждый оператор и операнд должны быть отдельным аргументом».

Назначение переменной различно и использует этот синтаксис name=[value]

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

Причина в том, что shell построена так, чтобы вести себя так. Возможно, это не имеет смысла для тех, кто имеет опыт работы на других языках программирования (если вы называете синтаксис оболочки «языком», что в некотором смысле это так).

Оболочка оболочки позволяет во многих случаях просто не указывать строки (если последовательность символов, предназначенных для одной строки, не содержит пробелов или специальных символов). Благодаря этому вы можете написать:

  my_command -n -X arg1 arg2 

Вместо (в каком-то мнимом псевдокоде)

  "my_command" "-n" "-X" "arg1" "arg2" 

В большинстве языков это наоборот: буквальные строки цитируются, что освобождает «синтаксическое пространство» для использования переменных без какого-либо специального символа (например, $ в сценариях оболочки).

Синтаксис Shell обеспечивает удобство в частых случаях за счет, а значит, меньше удобства (и удобочитаемости) при выполнении некоторых других действий. Это и проклятие, и благословение. Приятно знать, что если у вас есть интерактивная shell, вы можете быть на 100% уверены, что у вас есть интерпретатор, который будет обрабатывать какие-то (возможно, неэлегантные) программы. Благодаря своей универсальной доступности (несмотря на существование различных ароматов) shell является своего рода платформой, которая достаточно полезна, чтобы ее можно было изучать.

  • объявить глобальную собственность в QML для других файлов QML
  • Visual Studio 2015 Отладка: не удается расширить локальные переменные?
  • Что касается локальной переменной, проходящей в streamе
  • Как разместить рекламу в lesscss
  • Что такое ссылочная переменная в C ++?
  • Javascript: преобразование строки в число?
  • Создайте переменную в файле .CSS для использования в этом файле .CSS
  • Запустите mac eclipse с установленными переменными окружения
  • Лучше ли в C ++ проходить по значению или передавать постоянную ссылку?
  • Разница между статическими и частными статическими переменными
  • Создание нескольких нумерованных переменных на основе int
  • Давайте будем гением компьютера.