По моему мнению, лучший способ изучить новые фреймворки или технологии - это получить практический опыт одновременно, и здесь, в этой статье, вы изучите основы написания сценариев оболочки, написав код самостоятельно!
Эта статья содержит синтаксис, основы сценариев оболочки для программирования оболочки среднего уровня. Используйте это, чтобы получить знания о оболочке, которая предоставляет вам интерфейс с системой Linux / Unix :)

Вступление

Возможно, вы много раз встречали слово «сценарий», но что означает сценарий? По сути, сценарий - это программа, которая содержит серию выполняемых команд. Эти команды выполняются интерпретатором. Все, что вы можете поместить в командную строку, вы можете поместить в сценарий. Кроме того, сценарии отлично подходят для автоматизации задач.
Если вы обнаружите, что часто повторяете некоторые команды, вы можете, а лучше должны создать сценарий для этого!

Напишем наш первый сценарий

#!/bin/bash
echo "My First Script!"

Чтобы запустить это,

$ chmod 755 script.sh
$ ./script.sh

Wohooo! вы только что написали свой первый сценарий bash.
Я знаю, что вы не поняли сценарий, в основном первую строку. Не волнуйтесь, в этой статье мы подробно рассмотрим сценарии оболочки. Прежде чем переходить к какой-либо теме, я всегда рекомендую сформировать в уме дорожную карту или надлежащий указатель содержания и четко понимать, что мы собираемся изучить.
Итак, вот несколько ключевых моментов, которые мы собираемся обсудить в нашей статье.

  • Шебанг
  • Переменные
  • Пользовательский ввод
  • Тесты
  • Принимать решение
  • Итерационные операторы
  • Позиционные параметры
  • Статусы выхода
  • Логические операции
  • Функции
  • Подстановочные знаки
  • Отладка

Итак, это будет порядок нашего обсуждения, и в конце этой статьи, я уверен, вы будете достаточно уверены, чтобы сами писать сценарии оболочки :)
Счастливые ребята, обучающиеся

Шебанг

Вы могли заметить в приведенном выше сценарии, что он начинается с #!/bin/bash. Это называется shebang. По сути, это указание пути к интерпретатору. Интерпретаторов много, некоторые из них: bash, zsh, csh и ksh и т. Д.

Для использования bash: #!/bin/bash
Для использования zsh: #!/bin/zsh
Для использования ksh: #!/bin/ksh
Для использования csh: #!/bin/csh
и так далее…

Почему Шебанг?
# часто называют острым, а ! - ударом, отсюда и название: резкий удар, но обычно люди говорят это шебанг вместо резкого удара.

Примечание *. Если сценарий не содержит shebang, команды выполняются с использованием вашей оболочки, поэтому есть вероятность, что код может работать правильно, но все же это неправильный способ сделать это. !

Комментарии
Комментарии начинаются со знака #, все, что находится после знака решетки в этой строке, игнорируется.

Переменные

Переменные - это в основном место хранения, которое имеет имя и может хранить некоторые данные, которые могут быть изменены в будущем.

VARIABLE_NAME="Value"

Вы должны помнить некоторые моменты при именовании переменных:

  • Переменные чувствительны к регистру
  • По соглашению, переменные пишутся в верхнем регистре.
  • Чтобы использовать переменную, просто напишите имя переменной и поставьте знак $

Пример:

#!/bin/bash
MY_NAME="Madhav Bahl"
echo "Hello, I am $MY_NAME"
OR
#!/bin/bash
MY_NAME="Madhav Bahl"
echo "Hello, I am ${MY_NAME}"

Примечание *. Мы также можем назначить вывод команды переменной. Пример: LIST=$(ls), другой пример: SERVER_NAME=$(hostname)

Некоторые допустимые имена переменных:

THIS3VARIABLE=”ABC”
THIS_IS_VARIABLE=”ABC”
thisIsVariable=”ABC”

Некоторые недопустимые имена переменных:

4Number=”NUM”
This-Is-Var=”VAR”
# No special character apart from underscore is allowed!

Пользовательский ввод

Команда read принимает STDIN (стандартный ввод)

read -p "PROMPT MESSAGE" VARIABLE

Здесь на экран будет выведено «Сообщение с подсказкой», и все, что пользователь введет дальше, будет сохранено в VARIABLE

#!/bin/bash
read -p "Please Enter You Name: " NAME
echo "Your Name Is: $NAME"

Тесты

Тесты используются для принятия решений. [ condition-to-test-for ] Пример: `[ -e /etc/passwd ]

  1. Операции проверки файлов
-d FILE_NAM  # True if FILE_NAM is a directory
-e FILE_NAM  # True if FILE_NAM exists
-f FILE_NAM  # True if FILE_NAM exists and is a regular file
-r FILE_NAM  # True if FILE_NAM is readable
-s FILE_NAM  # True if FILE_NAM exists and is not empty
-w FILE_NAM  # True if FILE_NAM has write permission
-x FILE_NAM  # True if FILE_NAM is executable

2. Операции проверки строк

-z STRING  # True if STRING is empty
-n STRING  # True if STRING is not empty
STRING1 = STRIN2 # True if strings are equal
STRING1 != STRIN2 # True if strings are not equal

3. Арифметические операторы

var1 -eq var2  # True if var1 is equal to var2
var1 -ne var2  # True if var1 not equal to var2
var1 -lt var2  # True if var1 is less than var2
var1 -le var2  # True if var1 is less than or equal to var2
var1 -gt var2  # True if var1 is greater than var2
var1 -ge var2  # True if var1 is greater than or equal to var2

Принимать решение

Как и любой сценарий, сценарии оболочки могут принимать решения в зависимости от условий. Мы можем использовать If-Else (или If-Elif-Else) и утверждения случая для принятия решения.

  1. Заявление if
if [ condition-is-true ]
then
  command 1
  command 2
    ...
    ...
  command N
fi

Лестница if-elif

if [ condition-is-true ]
then
  command 1
elif [ condition-is-true ]
then
  command 2
elif [ condition-is-true ]
then
  command 3
else
  command 4
fi

2. Операторы case
Операторы case являются альтернативой операторам if, которые немного легче читать, чем сложные лестницы if elif. Если вы обнаружите, что используете оператор if для сравнения одной и той же переменной с некоторыми разными / дискретными значениями, вы можете использовать операторы case вместо лестницы if-elif.

Синтаксис:

case "$VAR" in
  pattern_1)
    # commands when $VAR matches pattern 1
    ;;
  pattern_2)
    # commands when $VAR matches pattern 2
    ;;
  *)
    # This will run if $VAR doesnt match any of the given patterns
    ;;
esac

Пример:

#!/bin/bash
read -p "Enter the answer in Y/N: " ANSWER
case "$ANSWER" in
  [yY] | [yY][eE][sS])
    echo "The Answer is Yes :)"
    ;;
  [nN] | [nN][oO])
    echo "The Answer is No :("
    ;;
  *)
    echo "Invalid Answer :/"
    ;;
esac

Итерационные операторы: циклы

Циклы могут выполнять блок кода несколько раз и в основном используются для выполнения итераций.

1. Цикл For

for VARIABLE_NAME in ITEM_1 ITEM_N
do
  command 1
  command 2
    ...
    ...
  command N
done

Например:

#!/bin/bash
COLORS="red green blue"
for COLOR in $COLORS
do
  echo "The Color is: ${COLOR}"
done

Другой способ использования цикла for:

for (( VAR=1;VAR<N;VAR++ ))
do
  command 1
  command 2
    ...
    ...
  command N
done

Вот пример того, как вы можете создать сценарий для переименования каждого файла с форматом .txt в new- ‹old-name› .txt.

#!/bin/bash
FILES=$(ls *txt)
NEW="new"
for FILE in $FILES
do
  echo "Renaming $FILE to new-$FILE"
  mv $FILE $NEW-$FILE
done

2. Цикл "Пока"

Цикл while повторяет серию команд до тех пор, пока выполняется данное условие.

while [ CONNDITION_IS_TRUE ]
do
  # Commands will change he entry condition
  command 1
  command 2
    ...
    ...
  command N
done

Условие может быть любым тестом или командой. Если тест / команда возвращает статус выхода 0, это означает, что условие истинно и команды будут выполнены. Если команда возвращает ненулевой статус выхода, цикл останавливает свои итерации. Если изначально условие ложно, то команды внутри цикла никогда не будут выполнены.
Не беспокойтесь, если вы не знаете, что такое статус выхода. Мы поговорим об этом чуть позже :)

Пример: построчное чтение файла

#!/bin/bash
LINE=1
while read CURRENT_LINE
do
  echo "${LINE}: $CURRENT_LINE"
  ((LINE++))
done < /etc/passwd
# This script loops through the file /etc/passwd line by line

Примечание.
continue используется для передачи управления на следующую итерацию. Любой оператор после нажатия на оператор continue не будет выполнен, и поток управления перейдет к следующей итерации.
Оператор break может использоваться в циклах while (или других циклах, таких как цикл for) для завершения циклов. При попадании в оператор break поток управления выйдет за пределы цикла.

Позиционные параметры

Некоторые аргументы или параметры могут быть переданы при вызове скрипта.
Например: $ ./script.sh param1 param2 param3 param4

Все параметры будут храниться в различных переменных:

  $0 -- "script.sh"
  $1 -- "param1"
  $2 -- "param2"
  $3 -- "param3"
  $4 -- "param4"
  $@ -- array of all positional parameters

К этим переменным можно получить доступ в любом месте сценария, как и к любой другой глобальной переменной.

Статусы выхода

Каждая команда возвращает статус выхода, также называемый кодом возврата, который находится в диапазоне от 0 до 255. Статус выхода используется для проверки ошибок.

  • 0 означает успех
  • Любой код кроме 0 означает состояние ошибки.

Чтобы узнать, что означает статус выхода для команды, можно просмотреть документацию или руководство, используя команду man или info.
$? содержит код возврата ранее выполненной команды.

Пример: сценарий, который распечатает Reachable/Unreachable хост / сервер с помощью команды ping.

#!/bin/bash
HOST="google.com"
ping -c 1 $HOST     # -c is used for count, it will send the request, number of times mentioned
RETURN_CODE=$?
if [ "$RETURN_CODE" -eq "0" ]
then
  echo "$HOST reachable"
else
  echo "$HOST unreachable"
fi

Пользовательские статусы выхода
Команда выхода используется для точного определения кода возврата. Если мы не определяем явно статус выхода сценария оболочки, то по умолчанию статус выхода последней выполненной команды принимается как статус выхода сценария. Мы можем использовать команду выхода в любом месте сценария, и как только будет обнаружена команда выхода, сценарий оболочки прекратит выполнение.

  exit 0
  exit 1
  exit 2
    ...
    ...
  exit 255

Логические операции

Сценарии оболочки поддерживают логическое И и логическое ИЛИ.

Логическое И = &&
Логическое ИЛИ = ||

Пример: mkdir tempDir && cd tempDir && mkdir subTempDir
В этом примере tempDir создается с помощью команды mkdir. В случае успеха выполняется cd tempDir, а затем mkdir subTempDir.

Функции

Набор инструкций, которые можно повторно использовать / вызывать в любое время из основной программы, когда возникает необходимость в этих инструкциях. Рассмотрим ситуацию, когда у вас есть конкретный модуль, который выполняет определенную работу, а теперь предположим, что эта работа должна быть выполнена 20 (скажем) раз в основной программе (например, вычисление максимального числа в массиве чисел). Теперь, если вы напишете код для этих 20 раз, ваш код станет очень большим, однако, если мы напишем функцию для этого и вызовем эту функцию всякий раз, когда это потребуется, код останется коротким, легким для чтения и многим другим. модульный.

Следовательно, функции хороши тем, что они делают код СУХИМ (D вместо R повторяет Y сам »), мы можем написать один раз и использовать это во многих случаях использование функций сокращает общую длину / размер скрипта. Более того, функции упрощают обслуживание программы, поскольку они делят код на модули, предоставляя определенное место для редактирования и устранения неполадок в случае ошибок / ошибок.

Примечание.
- Каждый раз, когда вы повторяете набор инструкций, создайте для этого функцию. (Функция должна быть определена перед использованием).
- Рекомендуется определять все свои функции вверху перед запуском основной программы или основных инструкций.

Синтаксис:

function function_name() {
    command 1
    command 2
    command 3
      ...
      ...
    command N
}

Чтобы вызвать функцию: просто напишите ее имя в строке скрипта.

#!/bin/bash
function myFunc () {
    echo "Shell Scripting Is Fun!"
}
myFunc

Позиционные параметры в функциях

Как и сценарий оболочки, функции также могут принимать параметры. Первый параметр хранится в $ 1, второй параметр хранится в $ 2 и так далее. $ @ содержит все параметры.
Примечание. $ 0 - это по-прежнему имя самого скрипта, а не имя функции.
Чтобы указать параметры, просто напишите их после имени функции. с пробелом между ними. myFunc param1 param2 param3 ...

Объем переменных

Глобальная область действия: все переменные по умолчанию имеют глобальную область действия. Наличие глобальной области означает, что к значению этой переменной можно получить доступ из любой точки сценария. Перед использованием необходимо определить переменные.
Локальная область: Доступ к локальным переменным можно получить только из функции. Локальные переменные создаются с использованием localkeyword, и только функции могут иметь локальные переменные. Рекомендуется хранить переменные внутри функции локально.

Подстановочные знаки

Шаблоны символов или строк, которые используются для сопоставления имен файлов и каталогов, называются подстановочными знаками. Процесс, используемый для расширения шаблона подстановки в список файлов и / или каталогов (или, по сути, пути), называется Globbing.
Подстановочные знаки можно использовать с большинством команд, для которых в качестве аргумента требуется путь к файлу / каталогу. (Пример: ls, rm, cp и т. Д.).

Некоторые часто используемые подстановочные знаки

* = соответствует нулю или более символов
Пример: *.txt hello.* great*.md

? = соответствует ровно одному символу
Пример: ?.md Hello?

[] = Класс символов
Этот подстановочный знак используется для сопоставления любого из символов, заключенных в квадратные скобки (соответствует ровно одному символу).
Пример: He[loym], [AIEOU]

[!] = удаляет символы, не заключенные в квадратные скобки
Соответствует ровно одному символу.
Пример: для соответствия согласному: [!aeiou]

Предопределенные именованные классы символов

  • [[:альфа:]]
  • [[: alnum:]]
  • [[:Космос:]]
  • [[: верхний:]]]
  • [[:ниже:]]
  • [[: цифра:]]

Соответствие подстановочных знаков: если нам нужно сопоставить сами подстановочные символы, такие как * или ?, мы можем использовать escape-символ - \
Пример: *\? - ›будет соответствовать всем файлам которые заканчиваются вопросительным знаком.

Отладка

Ошибка - это ошибка в компьютерной программе / программном обеспечении, которая приводит к неожиданному или неверному результату. Большинство ошибок связано с ошибками в коде и его дизайне. Чтобы исправить ошибку, попытайтесь найти причину этого неожиданного поведения.

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

Некоторые варианты:

1. -x параметр
Выводит команды и аргументы по мере их выполнения. Это называется отладкой печати, трассировкой или x-трассировкой. Мы можем использовать его, изменив первую строку #!/bin/bash -x

2. -e параметр
означает «Выход при ошибке». Это приведет к немедленному завершению вашего сценария, если команда завершится с ненулевым статусом выхода.

3. -v option
Он печатает команды оболочки / строки ввода по мере их чтения.

Примечание *. Эти параметры можно комбинировать, и одновременно можно использовать несколько вариантов!

#!/bin/bash-xe
#!/bin/bash-ex
#!/bin/bash-x-e
#!/bin/bash-e-x

Хотя существует множество инструментов, которые помогают в отладке, вы можете отлаживать код только в том случае, если понимаете, как он работает. Так что не забудьте потратить достаточно времени на то, чтобы попрактиковаться в написании скриптов и их отладке самостоятельно, чтобы узнать места, где вы можете делать ошибки, и не повторять их снова :)

Заключение

Вот и все, я надеюсь, что эта статья вам помогла :)
В случае сомнений, напишите мне. Мы можем подключиться на GitHub или LinkedIn, и я буду более чем счастлив, если вы присылаете свои отзывы, предложения или вопросы. Более того, я люблю заводить новых друзей, и мы можем быть друзьями, просто напишите мне.

Куда пойти отсюда?

Эта статья содержала основы написания сценариев оболочки. Но статьи имеют ограничения, мы не можем предоставить полную информацию о сценариях оболочки в одной статье. Поэтому я настоятельно рекомендую посетить этот веб-сайт, на котором я подробно писал о сценариях оболочки.



Сценарии оболочки
Возможно, вы много раз встречали слово« сценарий
, но что означает сценарий? Как можно писать… madhavbahlmd.github.io »



Кроме того, вы можете бесплатно скачать это руководство в формате pdf здесь!

Пройдя это руководство, я также рекомендую вам прочитать эту книгу Командная строка Linux Уильяма Шоттса », она объяснит вам, как работает командная строка / терминал Linux в деталях и как настроить ее, чтобы сделать ее многообещающей. лучше!

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

P.S. Я пытаюсь создать сообщество разработчиков под названием CodeToExpress, где мы учимся, делимся, развиваемся и растем вместе. Если интересно, присоединяйтесь к рабочему пространству Slack сегодня.

Ссылка для приглашения: https://join.slack.com/t/codetoexpress/shared_invite/enQtNDUwNzg0NDI1MzAwLWZiODY3OGZkZjdkZDA2MWNmMjFiNTY2MDlmMDg5ZGVjMzc5NDjME2OWMYUNM



Большое спасибо за то, что сохранили спокойствие и дочитали до конца. Всего наилучшего и удачного кодирования! Вы можете связаться со мной, если возникнут сомнения или вам понадобится помощь:
Электронная почта: [email protected]
Веб: http://madhavbahl.tech/
Github: https://github.com/MadhavBahlMD
LinkedIn: https://www.linkedin.com/in/madhavbahl/

✉️ Подпишитесь на рассылку еженедельно Email Blast 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .