2017-01-19 3 views
3
1 #!/bin/bash 
    2 
    3 declare -r NUM1=5 
    4 NUM2 =4 
    5 
    6 num3=$((NUM1 + NUM2)) 
    7 num4=$((NUM1 - NUM2)) 
    8 num5=$((NUM1 * NUM2)) 
    9 num6=$((NUM1/NUM2)) 
10 
11 echo "$num3" 
12 echo $((5**2)) 
13 echo $((5%4)) 
14 

И используя этот Баш скрипт и в то время как РМОК запуск сценария я получил ошибкуПочему пробел между присваиванием переменной дает ошибку в 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 

Так я изменил код для этого и ошибки исчезла.

 1 #!/bin/bash 
     2 
     3 declare -r NUM1=5 
     4 NUM2=4 
     5 
     6 num3=$((NUM1 + NUM2)) 
     7 num4=$((NUM1 - NUM2)) 
     8 num5=$((NUM1 * NUM2)) 
     9 num6=$((NUM1/NUM2)) 
    10 
    11 echo "$num3" 
    12 echo $((5**2)) 
    13 echo $((5%4)) 
    14 

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

Любые предложения или уточнения приветствуются ...

+1

Это только одна из тех парадигм в 'bash', вы не можете задать вопрос – Inian

+2

В оболочке пробелы являются важными разделителями. В большинстве случаев вы не можете ** добавлять или удалять их, чтобы они выглядели лучше, потому что они меняют смысл командной строки. –

+0

Спасибо, хотя это небольшая проблема. Ясность дает меньше ошибок. –

ответ

6

Это не условность в Баш (или, в более общем плане, 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 
+0

"NUM2 = 4 # работает" NUM3 "???? – some

3

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

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

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

Присваивание отличается и использует этот синтаксис name=[value]

Причина вы не можете поместить некотируемые пробелы вокруг знака равенства происходит потому, что Баш интерпретирует это как команду.

2

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

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

my_command -n -X arg1 arg2 

Вместо (в какой-то воображаемой псевдокоде)

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^