Не повторяйте моих ошибок!

Примечание: эта статья предназначена для разработчиков, которые привыкли к языкам высокого уровня, таким как C, C#, Javascript или Python, и плохо знакомы со сценариями Bash Shell.

#1 Жизненный цикл команды

Когда команда передается оболочке, интерпретатор выполняет следующие основные шаги:

  1. Подстановка переменных — заменяет все переменные их значениями.
  2. Синтаксический анализ строки — интерпретатор повторно сканирует строку и обрезает дополнительные пробелы между аргументами + анализирует специальные символы.
  3. Выполнение команды — выполнение заданной команды.

Например, как вы думаете, что будет на выходе нижеприведенного скрипта?

Давайте посмотрим, почему:

  1. Сначала оболочка заменяет переменную $ahah ее начальным значением.
  2. Затем он повторно сканирует строку и, поскольку значение $ahah не заключено в кавычки, обрезает все дополнительные пробелы (в результате получается «Несколько пробелов *») и, наконец, он анализирует специальный символ «*», который в данном случае перечисляет все файлы текущего каталога, разделенные пробелом
  3. Наконец, echo выполняется со следующими аргументами: «Несколько», «пробелы», «lifecycle.sh». и "phones.txt"

#2 Каждая переменная является строкой!

В Bash каждая переменная рассматривается как строка! Вот почему следующий скрипт выводит «Не равно»:

Чтобы сравнить два целых числа, мы должны использовать специальные опции, такие как -eq:

PS: для целочисленных операций, таких как сложение, вычитание, умножение или деление, вы должны использовать expr или $(())

#3 [ это команда

Забавный факт о Bash заключается в том, что [ — это настоящая команда. Проверьте это:

Команда [ — это, по сути, команда test, но она также требует закрывающего тега ].

Примечание. Вот почему пробелы между [и] так важны, потому что они разделяют аргументы команды! В противном случае команда [ не сможет правильно распознать свои аргументы.

#4 Не зацикливайтесь на $*

Зацикливание на $* почти всегда означает ошибку! Проверьте, что происходит, когда в указанном аргументе есть пробелы (второй запуск):

И это не решается добавлением двойных кавычек:

Как правило, мы ожидаем, что зациклимся на «$@»(включая двойные кавычки), например:

#5 Используйте параметр -x для отладки

Все мы знаем, что традиционные команды echo могут быть удобны для отладки, но в большинстве случаев параметр -x может упростить задачу! Посмотрите, что происходит, когда мы включаем эту опцию:

Чтобы узнать больше о Bash Shell, вы можете прочитать книгу Программирование оболочки в Unix, Linux и OS X Стивена Г. Кочана и Патрика Вуда.