Программирование оболочки, достаточно одной статьи

Shell

В этой статье сначала рассказывается о том, что такое программирование в Shell, дается быстрый старт, затем объясняется базовый синтаксис Shell и анализируется использование с упором на примеры, включая управление процессами в Shell и пользовательские функции. Рекомендуемая коллекция.

Кому нужно изучать программирование Shell?

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

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

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) эквивалентно обратным кавычкам

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

определение

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

  1. экспортировать имя переменной=значение переменной, выходные переменные оболочки как переменные среды.
  2. путь к исходному файлу конфигурации, чтобы измененная информация о конфигурации вступила в силу немедленно.
  3. 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

Пример

  1. Распечатайте аргументы, введенные в командной строке.

     #!/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
    
  2. Выведите добавленное значение от 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, и начать работу несложно. Если вы хотите изучить более продвинутое использование, вы можете изучить дополнительные статьи со мной. Я видел все это здесь, пожалуйста, ставьте большие пальцы вверх, чтобы подбодрить друг друга~