Пятница. 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 г.