Не повторяйте моих ошибок!
Примечание: эта статья предназначена для разработчиков, которые привыкли к языкам высокого уровня, таким как C, C#, Javascript или Python, и плохо знакомы со сценариями Bash Shell.
#1 Жизненный цикл команды
Когда команда передается оболочке, интерпретатор выполняет следующие основные шаги:
- Подстановка переменных — заменяет все переменные их значениями.
- Синтаксический анализ строки — интерпретатор повторно сканирует строку и обрезает дополнительные пробелы между аргументами + анализирует специальные символы.
- Выполнение команды — выполнение заданной команды.
Например, как вы думаете, что будет на выходе нижеприведенного скрипта?
Давайте посмотрим, почему:
- Сначала оболочка заменяет переменную $ahah ее начальным значением.
- Затем он повторно сканирует строку и, поскольку значение $ahah не заключено в кавычки, обрезает все дополнительные пробелы (в результате получается «Несколько пробелов *») и, наконец, он анализирует специальный символ «*», который в данном случае перечисляет все файлы текущего каталога, разделенные пробелом
- Наконец, echo выполняется со следующими аргументами: «Несколько», «пробелы», «lifecycle.sh». и "phones.txt"
#2 Каждая переменная является строкой!
В Bash каждая переменная рассматривается как строка! Вот почему следующий скрипт выводит «Не равно»:
Чтобы сравнить два целых числа, мы должны использовать специальные опции, такие как -eq:
PS: для целочисленных операций, таких как сложение, вычитание, умножение или деление, вы должны использовать expr или $(())
#3 [ это команда
Забавный факт о Bash заключается в том, что [ — это настоящая команда. Проверьте это:
Команда [ — это, по сути, команда test, но она также требует закрывающего тега ].
Примечание. Вот почему пробелы между [и] так важны, потому что они разделяют аргументы команды! В противном случае команда [ не сможет правильно распознать свои аргументы.
#4 Не зацикливайтесь на $*
Зацикливание на $* почти всегда означает ошибку! Проверьте, что происходит, когда в указанном аргументе есть пробелы (второй запуск):
И это не решается добавлением двойных кавычек:
Как правило, мы ожидаем, что зациклимся на «$@»(включая двойные кавычки), например:
#5 Используйте параметр -x для отладки
Все мы знаем, что традиционные команды echo могут быть удобны для отладки, но в большинстве случаев параметр -x может упростить задачу! Посмотрите, что происходит, когда мы включаем эту опцию:
Чтобы узнать больше о Bash Shell, вы можете прочитать книгу Программирование оболочки в Unix, Linux и OS X Стивена Г. Кочана и Патрика Вуда.