Программирование оболочки Linux
Программирование оболочки Linux

# Программирование оболочки Linux

# Зачем изучать Программирование оболочки

  1. Когда инженеры по эксплуатации и обслуживанию Linux выполняют управление кластером серверов, им необходимо писать программы Shell для управления сервером.
  2. Для программистов JavaEE и Python для рабочих нужд ваш начальник попросит вас написать несколько сценариев Shell для обслуживания программы или сервера, например, написать сценарий для регулярного резервного копирования базы данных.
  3. Программистам больших данных необходимо писать программы-оболочки для управления кластером.

# Что такое Шелл

Shell — это интерпретатор командной строки, который предоставляет пользователям интерфейс программы системного уровня, которая отправляет запросы ядру Linux для запуска программ. Пользователи могут использовать Shell для запуска, приостановки, остановки и даже написания некоторых программ. посмотрите на диаграмму

# Как выполняются сценарии оболочки

# Требования к формату сценария

  1. Скрипт начинается с #!/bin/bash.
  2. Скрипт требует разрешений на выполнение

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

  • Описание требования: Создайте сценарий оболочки для вывода hello world!

vim hello.sh

#!/bin/bash

echo "hello,world~"

# Распространенные методы выполнения скриптов

  • Способ 1 (введите абсолютный или относительный путь к скрипту) иллюстрировать:Сначала дайте разрешение +x сценарию helloworld.sh, а затем выполните сценарий. например: ./hello.sh или используйте абсолютный путь /root/shcode/hello.sh
  • Способ 2 (sh+скрипт) иллюстрировать:Нет необходимости давать скрипту разрешения +x, просто запустите его напрямую. например: sh hello.sh также может использовать абсолютные пути

# Переменные оболочки

# Введение в переменные оболочки

  1. Переменные в Linux Shell делятся на системные и определяемые пользователем переменные.
  2. системапеременная:、、SHELL、ПОЛЬЗОВАТЕЛЬ и так далее, например: echoДОМОЙПодожди...
  3. Отобразить все переменные в текущей оболочке: set

# Определение переменной оболочки

базовая грамматика

  1. Определите переменные: имя переменной = значение (обратите внимание, что в середине не должно быть пробелов)
  2. Неустановленная переменная:неустановленная переменная
  3. Статические переменные: переменные только для чтения, примечание: их нельзя сбросить.

Быстрый старт

Случай 1: Определите переменную A Случай 2: Отмена переменной A Случай 3: Объявить статическую переменную B=2 и ее нельзя отменить. Случай 4. Переменные можно повысить до глобальных переменных среды, которые могут использоваться другими программами оболочки (описано ниже).

Правила определения переменных

  1. Имена переменных могут состоять из букв, цифр и знаков подчеркивания, но не могут начинаться с цифры. 5А=200(×)
  2. По обе стороны от знака равенства не может быть пробелов.
  3. Имена переменных обычно пишутся заглавными буквами. Это норма, и мы можем ее соблюдать.

Присвойте возвращаемое значение команды переменной

  1. A='date' обратный апостроф, запустите команду внутри и верните результат в переменную A
  2. 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"

# Установить переменные среды

# базовая грамматика

  1. имя переменной экспорта = значение переменной (Описание функции: Вывод переменных оболочки как переменных среды/глобальных переменных)
  2. исходный файл конфигурации (описание функции: заставить измененную информацию о конфигурации вступить в силу самостоятельно)
  3. echo $variable name (описание функции: запрос значения переменных среды)

# Быстрый старт

  1. Определите переменную среды TOMCAT_HOME в файле /etc/profile.
  2. Просмотрите значение переменной среды TOMCAT_HOME.
  3. Используйте TOMCAT_HOME в другой программе оболочки. Уведомление:Прежде чем выводить переменную среды TOMCAT_HOME, она должна вступить в силу. source /etc/profile

Многострочные комментарии для сценариев оболочки

:<<!

содержание

!

# Переменная позиционного параметра

# Основное введение

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

Например: ./myshell.sh 100 200, это командная строка для запуска оболочки. Информацию о параметрах можно получить в сценарии myshell.

# базовая грамматика

n (Описание функции: n — число,0 представляет саму команду,

Описание функции: Эта переменная представляет все параметры в командной строке *рассматриваем все параметры в целом)

Переменная описания функции также представляет все параметры в командной строке, но @ обрабатывает каждый параметр по-разному)

$#(Описание функции:этотпеременная Представляет все в командной строкепараметрколичество>

  • Демонстрация примера: напишите сценарий оболочки myshell.sh для получения информации о каждом параметре командной строки в сценарии.
Язык кода:javascript
копировать
#!/bin/bash
echo "1=$0 2= $1 3=$2"
echo "Итак, параметр$*"
echo "$@"
echo "Количество параметра=$#"

# Предопределенные переменные

# Основное введение

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

# базовая грамматика

  1. $$(Описание функции: Идентификатор процесса (PID) текущего процесса)
  2. $!(Описание функции: Идентификатор процесса (PID) последнего процесса, работающего в фоновом режиме)
  3. $? (Описание функции: Статус возврата последней выполненной команды. Если значение этой переменной равно 0, это доказывает, что предыдущая команда была выполнена правильно; если значение этой переменной не равно 0 (определено конкретное число). самой командой) , это доказывает, что предыдущая команда была выполнена неверно).
  • Презентация кейса: Просто используйте Предопределенные в сценарии оболочки. переменныеpreVar.sh
Язык кода:javascript
копировать
#!/bin/bash
echo «В настоящее время выполняется идентификатор процесса = $$»
#Запускаем скрипт в фоновом режиме и получаем номер его процесса
/root/shcode/myshell.sh &
echo "Последний дочерний процесс, работающий в фоновом режиме, id=$!"
echo «Результат выполнения равен $?»

# оператор

# Основное введение

Научитесь выполнять различные операции в оболочке.

# базовая грамматика

  1. «Выражение операции или [выражение операции]» или expr m+ n //выражение
  2. Обратите внимание, что между операторами выражения должны быть пробелы. Если вы хотите присвоить результат выражения определенной переменной, используйте ` `.
  3. ` expr m - n`
  4. 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)

судебное решение

Общие условия принятия решения

  1. = сравнение строк
  2. Сравнение двух целых чисел -меньше чем -le меньше или равно немного равно -eq равно -gt больше, чем -ge больше или равно ne не равно
  3. Определить на основе прав доступа к файлам -r имеет разрешение на чтение -w имеет разрешение на запись -x имеет разрешения на выполнение
  4. Судите по типу файла -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: указать время ожидания (в секундах) при чтении значения. Если ввод не будет введен в течение указанного времени, ожидания больше не будет.
  • параметр переменная:указывает считанное значениепеременнаяимя

# Примеры применения

Язык кода:javascript
копировать
#!/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

# Пользовательская функция

базовая грамматика

[ function ] funname[()] {

Action;

​ [return int;]

}

Для звонка напишите название функции напрямую: funname [ценить]

Примеры применения

Язык кода:javascript
копировать
#!/bin/bash
#случай1: Рассчитать ввод двух параметров (динамический сбор),getSum

#Определениефункция getSum
function getSum(){


        SUM=$[$n1+$n2]
        echo "ида=$SUM"
}
#Введите два значения
read -p «Пожалуйста, введите число n1=" n1
read -p «Пожалуйста, введите число n2=" n2
# Вызов пользовательской функции
getSum $n1 $n2

# Программирование Оформление Комплексное дело

# анализ потребностей

  1. Резервное копирование базы данных frx01 в /data/backup/db каждый день в 2:30 ночи.
  2. Соответствующая информация может быть предоставлена ​​при запуске и завершении резервного копирования.
  3. Файл резервной копии должен иметь имя, соответствующее времени резервного копирования, и быть упакован в .tar.gz. форма, например: 2021-03-12_230201.tar .gz
  4. Во время резервного копирования,Проверьте, есть ли резервные копии файлов базы данных 10 дней назад.,Если да, то поставьте его удалить.
  5. Нарисуйте диаграмму анализа идеи
Язык кода: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} Успех~"

кронтаб -е 30 2 * * * /usr/sbin/mysql_db_backup.sh Заканчивать!

boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]