В этой статье сначала рассказывается о том, что такое программирование в Shell, дается быстрый старт, затем объясняется базовый синтаксис Shell и анализируется использование с упором на примеры, включая управление процессами в Shell и пользовательские функции. Рекомендуемая коллекция.
Кому нужно изучать программирование Shell?
- Инженер по эксплуатации и обслуживанию Linux: написание программ-оболочек для управления сервисным кластером.
- Программисты Python и JavaEE: написание программ сценариев Shell или обслуживание сервера, например написание сценария для регулярного резервного копирования базы данных.
- Программист больших данных: Напишите программы-оболочки для управления кластерами.
Что такое Шелл?
Shell — это право на интерпретацию команд, которое предоставляет пользователям запрос к ядру Linux для запуска программы системного уровня.Пользователи могут использовать Shell для запуска, приостановки, остановки и даже написания некоторых программ.
Быстрый старт в программировании оболочки
Войдите в терминал Linux и напишите сценарий оболочки hello.sh :
#!/bin/bash
echo 'hello world!'
бегать:
// 方法1
# sh hello.sh
// 方法2
# chmod +x hello.sh
# ./hello.sh
терминал распечатываетhello world!
.
проиллюстрировать:
-
#!
Сообщите системе, какой интерпретатор должен выполнять этот скрипт. - расширение файла
.sh
Не обязательно. - Метод 1 запускает интерпретатор напрямую,
hello.sh
в качестве аргумента интерпретатора оболочки. В настоящее время в сценарии оболочки не требуется указывать информацию об интерпретаторе, и первую строку можно удалить. - Способ 2 hello.sh запускается как исполняемая программа, и в первой строке сценария оболочки должен быть указан интерпретатор.
Переменные оболочки
определение
Переменные оболочки делятся насистемная переменнаяа такжепользовательская переменная. Системные переменные включают $HOME, $PWD, $USER и т. д. и отображают все переменные в текущей оболочке:set
.
Имена переменных могут состоять из букв, цифр и знаков подчеркивания и не могут начинаться с цифр.
базовая грамматика
- Определите переменные:Имя переменной = значение переменной, по обе стороны от знака равенства не должно быть пробелов, а имя переменной обычно используется в верхнем регистре.
- Удалить переменные:сбросить имя-переменной .
- Объявить статические переменные:имя переменной только для чтения, статические переменные не могут быть удалены.
- Используйте переменные:$переменнаяимя
Назначить возвращаемое значение команды переменной (выделение)
- A=`ls` обратные кавычки, выполнить команду внутри
- A=$(ls) эквивалентно обратным кавычкам
Переменные среды оболочки
определение
базовая грамматика
- экспортировать имя переменной=значение переменной, выходные переменные оболочки как переменные среды.
- путь к исходному файлу конфигурации, чтобы измененная информация о конфигурации вступила в силу немедленно.
- echo $variable name, проверьте, действует ли переменная окружения
переменная позиционного параметра
базовая грамматика
- $n : $1 представляет саму команду, $1-$9 представляет параметры с 1-го по 9-й, а фигурные скобки используются для более чем 10 параметров, таких как ${10}.
- $* : Все параметры в командной строке и рассматривать все параметры как единое целое.
- $@ : все параметры в командной строке и обрабатывать каждый параметр по-своему.
- $# : количество всех параметров.
Пример:
Напишите сценарий оболочки positionPara.sh для вывода информации о параметрах, введенных из командной строки.
#!/bin/bash
# 输出各个参数
echo $0 $1 $2
echo $*
echo $@
echo 参数个数=$#
бегать:
# chmod +x positionPara.sh
# ./positionPara.sh 10 20
результат операции:
positionPara.sh 10 20
10 20
10 20
参数个数=2
предопределенные переменные
определение
Переменная, на которую напрямую ссылаются в сценарии оболочки до определения назначения.
базовая грамматика
- ? : номер процесса PID текущего процесса.
- $! : номер процесса PID последнего процесса, запущенного в фоновом режиме.
- $? : статус возврата последней выполненной команды, 0 означает, что выполнение выполнено правильно, не 0 выполнение завершается ошибкой.
Пример:
Напишите сценарий оболочки prePara.sh для вывода информации о параметрах, введенной в командной строке.
#!/bin/bash
echo 当前的进程号=?
# &:以后台的方式运行程序
./hello.sh &
echo 最后一个进程的进程号=$!
echo 最后执行的命令结果=$?
результат операции:
当前的进程号=41752
最后一个进程的进程号=41753
最后执行的命令结果=0
# hello world!
оператор
базовая грамматика
- $((выражение)) или $[выражение]
- expr m + n Обратите внимание, что между операторами expr должны быть пробелы.
- expr m - n
- expr \*, /, % представляют умножение, деление и остаток соответственно
Пример
# 第1种方式 $(())
echo $(((2+3)*4))
# 第2种方式 $[],推荐
echo $[(2+3)*4]
# 使用 expr
TEMP=`expr 2 + 3`
echo `expr $TEMP \* 4`
Условное суждение
базовая грамматика
[ условие ] Обратите внимание, что перед условием и после него должны быть пробелы. Возвращает 0, если не пусто, 0 — истина, в противном случае — ложь.
Пример
#!/bin/bash
if [ 'test01' = 'test' ]
then
echo '等于'
fi
# 20是否大于10
if [ 20 -gt 10]
then
echo '大于'
fi
# 是否存在文件/root/shell/a.txt
if [ -e /root/shell/a.txt ]
then
echo '存在'
fi
if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world'
then
echo '条件满足,执行后面的语句'
fi
результат операции:
大于
hello
条件满足,执行后面的语句
Контроль процесса
если суждение
базовая грамматика
if [ 条件判断式 ];then
程序
fi
# 或者(推荐)
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
Пример
Напишите программу-оболочку: если входной параметр больше 60, выведите «пройдено», иначе выведите «сбой».
#!/bin/bash
if [ $1 -ge 60 ]
then
echo 及格
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
отделение дела
базовая грамматика
case $变量名 in
"值1")
如果变量值等于值1,则执行此处程序1
;;
"值2")
如果变量值等于值2,则执行此处程序2
;;
...省略其它分支...
*)
如果变量值不等于以上列出的值,则执行此处程序
;;
esac
Пример
Когда параметр командной строки равен 1, выводится «Понедельник», когда он равен 2, выводится «Вторник», а в других случаях выводится «Другое».
case $1 in
"1")
echo 周一
;;
"2")
echo 周二
;;
*)
echo 其它
;;
esac
для петли
базовая грамматика
# 语法1
for 变量名 in 值1 值2 值3...
do
程序
done
# 语法2
for ((初始值;循环控制条件;变量变化))
do
程序
done
Пример
-
Распечатайте аргументы, введенные в командной строке.
#!/bin/bash # 使用$* for i in "$*" do echo "the arg is $i" done echo "==================" # 使用$@ for j in "$@" do echo "the arg is $j" done
Результаты работы (обзор
$*
а также$@
разница):the arg is 1 2 3 ================== the arg is 1 the arg is 2 the arg is 3
-
Выведите добавленное значение от 1 до 100.
#!/bin/bash SUM=0 for ((i=1;i<=100;i++)) do SUM=$[$SUM+$i] done echo $SUM
пока цикл
базовая грамматика
while [ 条件判断式 ]
do
程序
done
Пример
Выведите добавленное значение от 1 до 100.
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
чтение консольного ввода
базовая грамматика
читать (опции) (параметры)
опции
- -p: указывает подсказку при чтении значения
- -t: указывает время (в секундах) ожидания при чтении значения.Если оно не введено в течение указанного времени, оно больше не будет ждать.
параметр
- имя переменной: имя переменной для чтения значения из
Пример
Прочитайте консоль, введите числовое значение.
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "你输入num1的值是:$NUM1"
read -t 10 -p "请在10秒内输入一个数num2=" NUM2
echo "你输入num2的值是:$NUM2"
результат операции:
请输入一个数num1=10
你输入num1的值是:10
请在10秒内输入一个数num2=20
你输入num2的值是:20
функция
Как и в других языках программирования, в программировании оболочки есть системные функции и пользовательские функции.В этой статье перечислены только две наиболее часто используемые системные функции.
Системная функция
- базовое имя, удалите все части (включая /) перед последним / пути, часто используемого для получения имени файла.
базовая грамматика
- basename [pathname] [suffx]
- basename [string] [suffx]
- Если указан суффикс, суффиксная часть пути или строки также удаляется.
Пример
# basename /usr/bin/sort sort # basename include/stdio.h stdio.h basename include/stdio.h .h stdio
- dirname, удалите все части (включая /) после последнего / пути, часто используемого для получения пути к файлу.
базовая грамматика
- dirname pathname
- Возвращает '.' (текущий путь), если путь не содержит / .
Пример
# dirname /usr/bin/ /usr # dirname dir1/str dir2/str dir1 dir2 # dirname stdio.h .
пользовательская функция
базовая грамматика
[ function ] funname[()]
{
Action;
[return int;]
}
# 调用
funname 参数1 参数2...
Пример
Вычисляет сумму двух входных параметров.
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个参数n1:" n1
read -p "请输入第二个参数n2:" n2
# 调用 getSum 函数
getSum $n1 $n2
Поздравляем! Вы освоили базовый синтаксис Shell, и начать работу несложно. Если вы хотите изучить более продвинутое использование, вы можете изучить дополнительные статьи со мной. Я видел все это здесь, пожалуйста, ставьте большие пальцы вверх, чтобы подбодрить друг друга~