Когда инженеры по эксплуатации и обслуживанию Linux выполняют управление кластером серверов, им необходимо писать программы Shell для управления сервером.
Для программистов JavaEE и Python для рабочих нужд ваш начальник попросит вас написать несколько сценариев Shell для обслуживания программы или сервера, например, написать сценарий для регулярного резервного копирования базы данных.
Программистам больших данных необходимо писать программы-оболочки для управления кластером.
Shell — это интерпретатор командной строки, который предоставляет пользователям интерфейс программы системного уровня, которая отправляет запросы ядру Linux для запуска программ. Пользователи могут использовать Shell для запуска, приостановки, остановки и даже написания некоторых программ. посмотрите на диаграмму
Способ 1 (введите абсолютный или относительный путь к скрипту)
иллюстрировать:Сначала дайте разрешение +x сценарию helloworld.sh, а затем выполните сценарий.
например: ./hello.sh или используйте абсолютный путь /root/shcode/hello.sh
Способ 2 (sh+скрипт)
иллюстрировать:Нет необходимости давать скрипту разрешения +x, просто запустите его напрямую.
например: sh hello.sh также может использовать абсолютные пути
Статические переменные: переменные только для чтения, примечание: их нельзя сбросить.
Быстрый старт
Случай 1: Определите переменную A
Случай 2: Отмена переменной A
Случай 3: Объявить статическую переменную B=2 и ее нельзя отменить.
Случай 4. Переменные можно повысить до глобальных переменных среды, которые могут использоваться другими программами оболочки (описано ниже).
Правила определения переменных
Имена переменных могут состоять из букв, цифр и знаков подчеркивания, но не могут начинаться с цифры. 5А=200(×)
По обе стороны от знака равенства не может быть пробелов.
Имена переменных обычно пишутся заглавными буквами. Это норма, и мы можем ее соблюдать.
Присвойте возвращаемое значение команды переменной
A='date' обратный апостроф, запустите команду внутри и верните результат в переменную A
A=$(дата) эквивалентно обратному кавычку
Язык кода:javascript
копировать
#!/bin/bash
# Случай 1: Определение переменнаяA
A=100
#Выходная переменная требует добавления $
echo A=$A
echo "A=$A"o
# Случай 2: Изъятие переменнойA
unset A
echo "A=$A"
# Случай 3: Объявите статическую переменнуюB=2 и не сможете ее отменить.
readonly B=2
echo "B=$B"
#Присваиваем результат, возвращаемый согласно инструкции, переменной
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
# Среда использованияпеременная TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"
Определите переменную среды TOMCAT_HOME в файле /etc/profile.
Просмотрите значение переменной среды TOMCAT_HOME.
Используйте TOMCAT_HOME в другой программе оболочки.
Уведомление:Прежде чем выводить переменную среды TOMCAT_HOME, она должна вступить в силу.source /etc/profile
Когда мы выполняем сценарий оболочки,Если вы хотите получить информацию о параметрах из командной строки,Вы можете использовать Переменную позиционного параметра
Например: ./myshell.sh 100 200, это командная строка для запуска оболочки. Информацию о параметрах можно получить в сценарии myshell.
$$(Описание функции: Идентификатор процесса (PID) текущего процесса)
$!(Описание функции: Идентификатор процесса (PID) последнего процесса, работающего в фоновом режиме)
$? (Описание функции: Статус возврата последней выполненной команды. Если значение этой переменной равно 0, это доказывает, что предыдущая команда была выполнена правильно; если значение этой переменной не равно 0 (определено конкретное число). самой командой) , это доказывает, что предыдущая команда была выполнена неверно).
Презентация кейса: Просто используйте Предопределенные в сценарии оболочки. переменныеpreVar.sh
Язык кода:javascript
копировать
#!/bin/bash
echo «В настоящее время выполняется идентификатор процесса = $$»
#Запускаем скрипт в фоновом режиме и получаем номер его процесса
/root/shcode/myshell.sh &
echo "Последний дочерний процесс, работающий в фоновом режиме, id=$!"
echo «Результат выполнения равен $?»
«Выражение операции или [выражение операции]» или expr m+ n //выражение
Обратите внимание, что между операторами выражения должны быть пробелы. Если вы хотите присвоить результат выражения определенной переменной, используйте ` `.
` expr m - n`
expr \*,/ ,% умножение, деление, остаток
Презентация кейса:
Язык кода:javascript
копировать
#!/bin/bash
# Случай 1. Вычислите значение (2+3)*4.
RES1=$(((2+3)*4))
echo "RES1=$RES1"
#Используйте второй метод
RES2=$[(2+3)*4]
echo "RES2=$RES2"
# Третий способ письма
TEMP=`expr 2 + 3`
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "RES3=$RES3"
# Случай 2. Запрос суммы двух параметров[целых чисел] в командной строке. 20 50
SUM=$[$1+$2]
echo "SUM=$SUM"
[условие] (примечание: до и после условия должны быть пробелы)
# Возвращаем true, если не пусто,Вы можете использовать $? для проверки (0 истинно).,>1дляfalse)
судебное решение
Общие условия принятия решения
= сравнение строк
Сравнение двух целых чисел
-меньше чем
-le меньше или равно немного равно
-eq равно
-gt больше, чем
-ge больше или равно
ne не равно
Определить на основе прав доступа к файлам
-r имеет разрешение на чтение
-w имеет разрешение на запись
-x имеет разрешения на выполнение
Судите по типу файла
-f файл существует и является файлом
-e файл существует
-d файл существует и является каталогом
Примеры применения
Язык кода:javascript
копировать
#!/bin/bash
#Случай 1: «ок», равен ли «ок»
#судебное решение:использовать=
if [ "ok" = "ok" ]
then
echo "equal"
fi
#case2:23Ли больше,чемравный22
#судебное решение:использовать -ge
if [ 23 -ge 22 ]
then
echo "больше, чем"
fi
#Случай 3:/root/shcode/aaa.txt Существует ли файл в каталоге и является ли он файлом
#судебное решение:использовать -f
if [ -f /root/shcode/aaa.txt ]
then
echo "существовать"
fi
#случай
if [ frx ]
then
echo "искренне"
fi
базовая грамматика
if [ условное суждение ]
then
код
fi
Или несколько ветвей
if [ условное суждение ]
then
код
elif [ условное суждение ]
then
код
fi
На что следует обратить внимание
[ условное суждение ], квадратные скобки и условное Должен быть пробел между обсуждением
Примеры применения
Язык кода:javascript
копировать
#!/bin/bash
#случай:Напишите, пожалуйста, программу-оболочку,Если вы введете параметр,больше, чемравный60, то вывод "пройдено", если меньше, чем60, то вывод "не удалось"
if [ $1 -ge 60 ]
then
echo "прошедший"
elif [ $1 -lt 60 ]
then
echo "Неуспешный"
fi
базовая грамматика
case $имя переменной in
«значение 1»)
Если значение переменной равно значению 1, выполнить программу 1
;;
"значение2")
Если значение переменной равно значению 2, выполнить программу 2.
;;
... Опустить другие ветки ...
*)
Если значение переменной не соответствует указанному выше значению, выполните эту программу
;;
esac
Примеры применения:
Язык кода:javascript
копировать
#!/bin/bash
#случай1: Когда параметр командной строки равен 1,Выход "в понедельник",да2час,Сразувыход"Вторник",Другие ситуациивыход"other“
case $1 in
"1")
echo "в понедельник"
;;
"2")
echo "Вторник"
;;
*)
echo "other..."
;;
esac
базовая грамматика
for переменная in значение 1 Значение 2 Значение 3...
do
программа/код
done
базовая грамматика2
for(( Начальное значение условия управления контуром; ))
do
программа/код
done
Примеры применения
Язык кода:javascript
копировать
#!/bin/bash
# Случай 1: ввод параметра команды печати [Здесь вы можете увидеть $* и $@ разница]
# Обратите внимание, что $* обрабатывает входной параметр как единое целое, поэтому на выходе будет только одно предложение.
for i in "$*"
do
echo "num is $i"
done
# Используйте $@ Чтобы получить входной параметр, обратите внимание ,В настоящее время они рассматриваются отдельно.,Итак, есть несколько параметров,>Сразувыходнесколько слов
echo "========================================"
for j in "$@"
do
echo "num is $i"
done
Язык кода:javascript
копировать
#!/bin/bash
#случай1:от1добавить в100изценитьвыходпоказывать,Пучок100сделалпеременная
# определить переменную SUM
SUM=0
for(( i=1; i<=$1; i++ ))
do
#writeyourbusinessкод
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
базовая грамматика
while [ условное суждение ]
do
программа/код
done
Уведомление:Есть пробелы в while и квадратных скобках, а также пробелы в условных выражениях и квадратных скобках.
Примеры применения
Язык кода:javascript
копировать
#!/bin/bash
#случай1:от Введите число в командной строкеn,статистикаот1+...+nизценитьда Сколько
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
#iincrement
i=$[$i+1]
done
echo «Результат выполнения=$SUM»
Параметры
-p: указывает подсказку при чтении значения
-t: указать время ожидания (в секундах) при чтении значения. Если ввод не будет введен в течение указанного времени, ожидания больше не будет.
#!/bin/bash
#случай1: Прочтите консоль и введите значение NUM1.
read -p «Пожалуйста, введите число NUM1=" NUM1
echo "Введенное вами число NUM1=$NUM1"
#случай2:Прочтите консоль и введитеNUM2ценить,Введите в течение 10 секунд
read -t 10 -p «Пожалуйста, введите число NUM2=" NUM2
echo "Введенное вами число NUM2=$NUM2"
shellпрограммированиеидругойпрограммированиетот же язык,Есть системная функция,Вы также можете настроить функцию. Системная функция,Мы представим здесь два.
basename базовая грамматика
Функция: возвращает последнюю часть полного пути, часто используемую для получения имени файла.
basename [pathname] [suffix]
basename [string] [suffix] (Описание функции: команда basename удалит все префиксы, включая последний символ (/), а затем отобразит строку)
Параметры
suffix — это суффикс. Если указан суффикс, basename удалит суффикс из пути или строки..
Примеры применения
Случай 1. Вернитесь к части «test.txt» файла /home/aaa/test.txt.
basename /homelaaa/test.txt
Случай 2. Вернитесь к «тестовой» части файла /home/aaa/test.txt.
basename /homelaaa/test.txt .txt
dirname базовая грамматика
Функция: возврат последней/предыдущей части полного пути, часто используется для возврата части пути.
dirname абсолютный путь к файлу (Описание функции: удалить имя файла (часть, не относящуюся к каталогу) из заданного имени файла, содержащего абсолютный путь, а затем вернуть оставшийся путь (часть каталога))
Примеры применения
Случай 1: Пожалуйста, верните /home/aaa из /home/aaa/test.txt.
dirmame /home/aaa/test.txt
Резервное копирование базы данных frx01 в /data/backup/db каждый день в 2:30 ночи.
Соответствующая информация может быть предоставлена при запуске и завершении резервного копирования.
Файл резервной копии должен иметь имя, соответствующее времени резервного копирования, и быть упакован в .tar.gz. форма, например: 2021-03-12_230201.tar .gz
Во время резервного копирования,Проверьте, есть ли резервные копии файлов базы данных 10 дней назад.,Если да, то поставьте его удалить.
Нарисуйте диаграмму анализа идеи
Язык кода:javascript
копировать
#!/bin/bash
#Каталог резервного копирования
BACKUP=/data/backup/db
#Текущее время
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo "$DATETIME"
# Адрес базы данных
HOST=localhost
#Имя пользователя базы данных
DB_USER=root
#пароль базы данных
DB_PW=frx01123
#Имя резервной базы данных
DATABASE=frx01
#Создаем каталог резервных копий, если BACKUP не существует, создайте его
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#Резервное копирование базы данных
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#Обрабатываем файл в tar,gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
# Удалить соответствующий каталог резервной копии
rm -rf ${BACKUP}/${DATETIME}
#Удалить файлы резервных копий, созданные 10 дней назад
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo «Резервная база данных ${DATABASE} Успех~"