Пятница. 31 марта 2017 г. – 5 мин.
Написание сценариев оболочки может стать очень запутанным, причина этого для меня в том, что мы рассматриваем сценарии оболочки как утилиту, а не как настоящий язык (если вы так думаете, вы ошибаетесь, bash — это волшебство и очень мощный инструмент для программирования). язык).
Сначала функция
Мой первый совет — встраивайте в функцию все, даже самое главное.
У нас должны быть простые компоненты/функции и связанные темы для решения сложных проблем.
В вашем коде ваша функция должна быть простой, состоять из нескольких строк и выполнять одно действие.
Ваша функция должна следовать правилам, применяемым в функциональном программировании, поэтому они должны быть ЧИСТЫМИ!
function command1 {
# code body
}
function command2 {
# code body
}
function main {
command1
}
#run the code main
Параметры функции
Чтобы получить доступ к параметрам внутри функции, мы используем $INDEX
, INDEX
связано с позицией параметра.
say_function hello bob $1 $2
Чтобы сделать это более понятным внутри определения функции и не добавлять путаницы, когда мы обрабатываем более одного параметра, вы должны связать параметры с локальной переменной, чтобы упростить отслеживание.
function say_function {
verbe=$1
name=$2
echo "$verbe $name :)"
}
В следующем сообщении в блоге я покажу вам, как протестировать эту прекрасную функцию.
Использовать стандартный вывод
Что мне всегда нравилось и восхищало в оболочке, так это возможность составлять команды, которые взаимодействуют друг с другом с помощью stdin и stdout. просто, чисто и красиво.
Таким образом, когда вы вызываете функцию, все становится ясно, если функция должна что-то возвращать, поэтому вы сразу будете знать, где взять результат.
Итак, ваша функция получает данные из params и помещает результат в stdout вместо params, ваша функция может читать из stdin, но я не буду обсудите это в этом сообщении в блоге.
Перенаправление потока
Представьте, что у вас есть случай, когда вам нужно вызвать function2
с результатом function1
. Дело здесь в том, что результатом function1
может быть текст или длинная строка с большим количеством пробелов.
Давайте сначала посмотрим, как это может быть проблематично.
function list_friends {
echo 'kamal peter yassin chakib'
}
function say_bye {
echo "Oh my friends: $1, bye bye !"
}
say_bye $(list_friends)
// the result Oh my friends: kamal, bye bye !
Как видите, say_bye учел только первое имя, после оценки $(list_friends)
у нас есть say_bye kamal peter yassin chakib
, а первые параметры — $1 == kamal
.
Чтобы решить эту проблему, мы можем использовать магию перенаправления, предоставляемую bash. Давайте попробуем поиграть с ним:
say_bye <(list_friends)
# => Oh my friends: /dev/fd/45, bye bye
Таким образом, <
выделяет для нас файловый дескриптор и вводит в него вывод list_friends
. Чтобы прочитать содержимое дескриптора файла, мы будем использовать простой cat
function say_bye { echo "Oh my friends: $(cat $1), bye bye !" }
Это очень полезно, когда вам нужно манипулировать выводом функции в виде файла и вызывать для него команды, ожидающие получения файлов в качестве входных данных.
function get_old_file { # will echo/cat the content of the file }
function get_new_file { # will echo/cat the content of the file } function compute_diff { diff <(get_old_file) \ <(get_new_file) }
Переменные
Вы должны использовать глобальные переменные только для констант, таких как ключи API, путь к журналу и т. д. иначе запрещено :)
Используйте то же форматирование для имени переменной
Лично для констант я использую верхний регистр как API_KEY
Локальные переменные (внутри функций), я использую нижний регистр parameter_name
Общая форма
Попробуйте в своем коде, чтобы каждая строка отвечала за выполнение одной задачи, благодаря \
, который позволяет нам разбивать одну строку на несколько.
curls -XGET http://www.google.fr \ # this line will fetch the page
| wc -c # this line will compute the number of chars
Это также облегчит отслеживание и обновление вашего кода.
Вывод
Итак, я показал вам несколько приемов, которые сделают ваш bash более чистым, очевидно, это не единственный способ, но эти правила могут помочь вам начать делать вещи чище.
В следующем сообщении в блоге я покажу вам, как тестировать эти сценарии оболочки и быть уверенным в их поведении, а в конце подготовить сценарии оболочки!
Хорошего дня.
Первоначально опубликовано на blog.heyzimo.com 31 марта 2017 г.