Введение в сценарии оболочки за 10 минут

Linux Командная строка Shell

предисловие

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

Адрес Github: https://github.com/hi-dhl/fast_guides

что такое оболочка

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

Окружающая среда и инструменты

Shell — это то же самое, что программирование на Java, PHP и Python, если есть текстовый редактор, который может писать код, и интерпретатор сценариев, который может интерпретировать и выполнять.

Mac OS, Linux поставляется с интерпретатором оболочки, Windows доставляет больше хлопот, так как Win7 Professional Edition и Ultimate Edition по умолчанию устанавливают PowerShell, а не устанавливаются в Standard Edition и Home Edition.Для удобства рекомендуется установить cygwin

PHP, Python также можно запрограммировать как Shell

PHP и Python — это языки программирования высокого уровня, но их также можно использовать для программирования оболочки, поскольку при наличии интерпретатора их также можно использовать в качестве скриптового программирования.

Вот пример сценария оболочки Python (при условии, что имя файла — op_python_base.py):

#!/usr/bin/env python3 //告诉Python从系统环境中找python
# -*- coding: utf-8 -*- //设置为UTF-8编码

for index in range(10):
    print(index);

Исходный код:op_python_base

Вот пример сценария оболочки PHP (при условии, что имя файла — op_php_base.php):

#!/usr/bin/php
<?php

for($i=0 ;$i<10; $i++){
    echo $i;
}

?>

Исходный код:op_php_base

Зачем изучать Шелл

Поскольку для написания скриптов можно использовать и PHP, и Python, есть несколько причин, по которым вам следует изучить незнакомую и непонятную оболочку.

  • Совместимость со средой, PowerShell устанавливается по умолчанию в Win7 Professional Edition и Ultimate Edition, но не устанавливается в Standard Edition и Home Edition.Интерпретаторы оболочки предварительно встроены в другие основные операционные системы, поэтому они написаны на sh и bash и предоставляются другим.Очень удобно, но для PHP, Python и т. д. необходимо установить соответствующее окружение

  • Если вы хотите выполнить некоторые запланированные задачи, такие как обнаружение существования процесса, автоматическое резервное копирование или автоматическое развертывание среды, синхронизация данных между серверами и т. д. sh, bash будет вашим лучшим выбором

Ш и БАШ

sh: оболочка Bourne, стандартный интерпретатор оболочки POSIX (Portable Operating System Interface), путь к двоичному файлу обычно /bin/sh

bash: Bash является альтернативой оболочке Bourne и принадлежит проекту GNU.Путь к двоичному файлу обычно /bin/bash.

первый сценарий оболочки

Сначала рассмотрим пример

Я считаю, что дети, написавшие код, должны быть знакомы со следующим кодом (при условии, что имя файла — op_base.sh):

#!/usr/bin/env bash
mkdir code
cd  code
for ((i=0; i<3; i++)); do
    touch test_${i}.txt
    echo "shell很简单" >> test_${i}.txt
done

Первая строка: найти интерпретатор указанного скрипта из системного пути Строка 2: создайте папку с именем code Третья строка: войти в созданную папку Четвертая строчка: петля for 3 раза Четвертая строка: создать файл Пятая строка: запись информации в созданный файл Строка 6: конец цикла

mkdir, touch, cd, touch, echo — все это системные команды, которые можно выполнять прямо в командной строке. for, do, done — это синтаксис языка сценариев оболочки для цикла

Исходный код:op_base.sh

написать оболочку

Создайте новый файл с расширением sh (sh означает shell). Расширение не влияет на выполнение скрипта. Хорошо знать имя. Если вы используете php, расширение будет php. Если вы используете Python, расширение питон.

Первая строка обычно выглядит так:

#!/usr/bin/php
#!/usr/bin/env python3
#!/usr/bin/env bash

#!" - это маркер соглашения, который сообщает системе, какой интерпретатор должен выполнить этот скрипт. /env — системный каталог PATH для поиска

Существует два способа запуска сценариев оболочки:

как исполняемая программа

chmod +x op_base.sh
./op_base.sh

Первая строка задает разрешение исполняемого файла op_base.sh. Вторая строка выполняет op_base.sh

как параметр

/bin/sh op_base.sh

Переменная

При определении переменной нет необходимости добавлять символ перед именем переменной, как в Python, но в языке PHP переменные нужно добавлять с помощью $, например:

my_name="jack"
my_name='jack';

ps: Между именем переменной и знаком равенства не может быть пробела, а после переменной не может быть пробела;

Цитаты в оболочке похожи на PHP, строки могут использовать отдельные кавычки или двойные цитаты

Ограничения для строк в одинарных кавычках:

  • Любой символ в одинарных кавычках будет выводиться как есть, переменные в одинарных кавычках недействительны.
  • Одинарные кавычки не могут появляться в строках с одинарными кавычками (ни после использования escape-символа для одинарных кавычек).

Двойные кавычки:

  • Переменные можно заключать в двойные кавычки
  • Экранирующие символы могут быть заключены в двойные кавычки.

Но в Python нет разницы между одинарными и двойными кавычками, но в Python также есть три кавычки, и символы внутри трех кавычек не будут экранированы.

использовать переменные

Для переменных, которые уже были определены, подходящим использованием является добавление $ перед

echo $my_name
echo ${my_name}

Фигурные скобки вне имени переменной необязательны, их можно добавлять или нет, рекомендуется использовать вторую форму

Примечания

Строки, начинающиеся с «#», являются комментариями и игнорируются интерпретатором.

многострочный комментарий

В sh нет многострочных комментариев, можно только добавлять знак # к каждой строке. нравится:

#--------------------------------------------
# Author:  jack 
#
# Notes: 10分钟入门Shell脚本编程
#
# Project home page:
#       https://github.com/hi-dhl/fast_guides
#--------------------------------------------

нить

Строки могут быть в одинарных, двойных кавычках или без кавычек. Разница между одинарными и двойными кавычками аналогична PHP.

В Shell нет php и python, как в других языках.Типов данных много.Типы данных, которые обычно используются в Shell, это строки, числа и строки (ps: кроме чисел и строк нет других типов, которые были бы просты в использовании , хаха)

Ограничения для строк в одинарных кавычках:

  • Любой символ в одинарных кавычках будет выводиться как есть, переменные в одинарных кавычках недействительны.
  • Одинарные кавычки не могут появляться в строках с одинарными кавычками (ни после использования escape-символа для одинарных кавычек).

Двойные кавычки:

  • Переменные можно заключать в двойные кавычки
  • Экранирующие символы могут быть заключены в двойные кавычки.

Манипуляции со строками

объединить строки

my_name="jack";
my_age="20岁"
echo $my_name $my_age
echo $my_name$my_age

получить длину строки

echo ${#my_name}

строка перехвата

echo ${my_name:0:2}

Исходный код:op_str.sh

Массив оболочки

определить массив

В Shell массивы представлены круглыми скобками, а элементы массива разделены пробелами. Общая форма определения массива:

name=(name1 name2 name3)

Также возможно определить отдельные компоненты массива по отдельности:

ary[0]=name1
ary[1]=name2
ary[3]=name3

p.s. Непрерывные нижние индексы использовать нельзя, диапазон нижних индексов не ограничен

читать массив

Общий формат чтения значения элемента массива:

${数组名[下标]}

Например:

echo ${name[0]}

Используйте символ @, чтобы получить все элементы массива, например:

echo ${name[@]}

получить длину массива

Метод получения длины массива такой же, как и метод получения длины строки, например:

# 取得数组元素的个数
length=${#name[@]}
echo $length

# 或者
length=${#name[*]}
echo $length

# 取得数组单个元素的长度
lengthn=${#name[n]}
echo $length

Исходный код:op_arry.sh

Управление потоком оболочки

В отличие от Java, PHP, Python и других языков, управление потоком sh не может быть пустым, например (следующий метод написания управления потоком PHP):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 不做任何事情
}

Вы не можете написать это в sh/bash.Если в ветке else нет выполнения операторов, не пишите это else

if

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

пример:

#!/usr/bin/env bash

a=1
b=2
if [ $a == $b ]
    then
        echo "a 等于 b"
 elif [ $a -gt $b ]
    then
        echo "a 大于 b"
 elif [ $a -lt $b ]
    then
        echo "a 小于 b"
 else
    echo "没有符合的条件"

 fi

Исходный код:op_if.sh

для цикла

Цикл for в Shell чем-то похож на цикл Python.

Python для цикла
for index in 1,2,3,4,5:
    print(index);
Цикл for в оболочке, первый способ записи
for index in 1 2 3 4 5; do
    echo "index="$index
done
Цикл for в оболочке, второй способ записи
for ((i=0; i<5; i++)); do
    echo "i="$i
done

Исходный код:op_for.sh

пока оператор

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

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

Исходный код:op_while.sh

Оболочка в сочетании с системными командами

Сценарий sh в сочетании с системными командами имеет мощную силу.В области обработки символов есть grep, awk и sed.grep отвечает за поиск определенной строки, awk может разбить строку на несколько полей, а sed может реализовать обновление.Написать операции, такие как вставки и удаления.

Например, регулярно проверяйте, закрыты ли nginx и mysql.

path=/var/log
log=${path}/httpd-mysql.log

name=(apache mysql)

exs_init[0]="service httpd start"
exs_init[1]="/etc/init.d/mysqld restart"

for ((i=0; i<2; i++)); do
    echo "检查${name[i]}进程是否存在"
    ps -ef|grep ${name[i]} |grep -v grep
    if [ $? -eq 0 ]; then
        pid=$(pgrep -f ${name[i]})
        echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} is running with pid $pid" >> ${log}
     else
        $(${exs_init[i]})
        echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} start success" >> ${log}
    fi
done

Объяснение: Определите, существуют ли процессы nginx и mysql, и если они не существуют, они будут автоматически перезапущены. Каждый раз, когда скрипт запускается, он будет писать журнал.Если вам нечего делать, вы можете перейти к файлу журнала.Если процесс существует нечасто, я боюсь, вам нужно исследовать основную причину.

Исходный код:check_nginx.sh

Отредактируйте файл /etc/crontab.

crontab -e

Добавьте строку в конец файла:

*/5 * * * * /xxx/check_nginx.sh > /dev/null 2>&1

Вышеприведенное означает, что каждые 5 минут выполняется скрипт /xxx/check_nginx.sh, где xxx представляет путь

/dev/null 2>&1 означает, что команда оболочки не выводит никакой информации на консоль и не выводит никакой информации в файл.

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * command to be executed

После добавления конфигурации необходимо перезапустить, чтобы она вступила в силу.

service crond restart