El estudio de Linux señala la programación de dos scripts de shell

Programación de scripts de shell

Requisitos de formato de secuencia de comandos

1. La secuencia de comandos comienza con #! / Bin / bash
2. La secuencia de comandos debe tener permisos de ejecución

El primer script de shell

vim hello.sh
#!/bin/bash
echo "hello,world~"

Métodos comunes de ejecución de scripts

1. (Ingrese la ruta absoluta o la ruta relativa del
script ) Primero otorgue permiso al script + x, y luego ejecute
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
2. Sh + script, no es necesario dar permiso a script + x, simplemente ejecútelo directamente
Inserte la descripción de la imagen aquí

Variables de shell

1. Las variables en el shell de Linux se dividen en variables del sistema y variables definidas por el usuario
2. Variables del sistema: $HOME $PWD $SHELL $USERetc.
3. Mostrar todas las variables en el shell actual: conjunto
4.${ }中放的是变量,例如echo ${PATH}取PATH变量的值并打印,也可以不加括号比如$PATH

Definición de variables de shell

Sintaxis básica
1. Definir variable: nombre de variable = valor
2. Variable no definida: variable no definida
3. Declarar variable estática: variable de solo lectura, no se puede desarmar

solicitud

vim var.sh
#!bin/bash
#定义变量A
A=100
#输出变量,需要加上$
echo $A
echo A=$A
echo "A=$A"
#撤销变量A
unset A
echo "A=$A"
#声明静态变量B
readonly B=2
echo "B=$B"

Reglas para generar
Inserte la descripción de la imagen aquí
variables de shell

1. Los nombres de las variables pueden constar de letras, números y guiones bajos, pero no pueden comenzar con números.
2. No puede haber espacios a ambos lados del signo igual
3. Los nombres de las variables generalmente se escriben en mayúscula.

Asignar el valor de retorno del comando a una variable

1 、

A=`date`

Ejecute el comando dentro y devuelva el resultado a la variable A

2. A = es $(date)equivalente a usar comillas invertidas

Por ejemplo, agregue la siguiente declaración en el ejemplo anterior

#将指令返回的结果赋给变量
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"

El resultado de salida ha
Inserte la descripción de la imagen aquí
establecido variables de entorno.

Sintaxis básica
1. Exportar nombre de variable = valor de variable: variables de shell de salida como variables de entorno
2. Archivo de configuración de origen: hacer que la información de configuración modificada surta efecto inmediatamente
3. Nombre de variable de eco: consultar el valor de las variables de entorno

Una vez establecida la variable de entorno, se puede utilizar en el programa de shell

Comentarios de varias líneas para scripts de shell

:<<!
内容
!

Variable de parámetro posicional

Cuando ejecutamos un script de shell, si queremos obtener la información de parámetro de la línea de comando, podemos usar variables de parámetro posicionales, como: ./myshell.sh 100200, esta es una línea de comando para ejecutar el shell, que puede estar en el script de myshell Obtener información de los parámetros

Sintaxis básica
$ n: n es un número, $ 0 representa el comando en sí, $ 1- $ 9 representa del primero al noveno parámetro, los parámetros por encima de diez, los parámetros por encima de diez deben estar entre llaves, como $ {10}

$ *: representa todos los parámetros en la línea de comando y trata todos los parámetros como un todo

$ @: también representa todos los parámetros en la línea de comando, pero trata cada parámetro de manera diferente

$ #: Representa el número de todos los parámetros en la línea de comando

Por ejemplo: escriba el script myshell.sh

vim myshell.sh
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "所有的参数=$@"
echo "参数的个数=$#"

Ingrese el comando y obtenga las
Inserte la descripción de la imagen aquí
variables predefinidas

Las variables definidas por el diseñador de shell de antemano se pueden utilizar directamente en el script de shell

Sintaxis básica
$$: el número de proceso del proceso actual

$ !: El número de proceso del último proceso que se ejecuta en segundo plano

$ ?: El estado de retorno del último comando ejecutado. Si el valor de esta variable es 0, prueba que el comando anterior se ejecutó correctamente, si el valor de esta variable no es 0, prueba que el comando anterior se ejecutó incorrectamente.

Por ejemplo, escriba el script preVar.sh

#!/bin/bash
echo "当前执行的进程id=$$"
#以后台的方式运行一个脚本,并获取它的进程号
/root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"

El resultado de la ejecución es
Inserte la descripción de la imagen aquí

Operación aritmética

Sintaxis básica
1 $((运算式))o $[运算式]
2, expr m + nsi desea asignar el resultado de expr a una variable, use la comilla inversa
3, multiplicación de expr *

Aplicación
Calcule el valor de (2 + 3) * 4 para
encontrar la suma de los dos parámetros de la línea de comando, 20 50

vim oper.sh
#!/bin/bash
#计算(2+3)*4的值
#第一种方式
RES1=$(((2+3)*4))
echo "RES1=$RES1"
#第二种方式,推荐
RES2=$[(2+3)*4]
echo "RES2=$RES2"
#第三种方式
TEMP=`expr 2 + 3`
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "RES4=$RES4"
#求出命令行的两个参数的和
SUM=$[$1+$2]
echo "SUM=$SUM"

Resultados de la
Inserte la descripción de la imagen aquí

Juicio condicional

Gramática básica

[ 内容 ]

Devuelve verdadero si no está vacío, usa $? Para verificar (0 es verdadero,> 1 es falso)

Condiciones de juicio de uso común
1, = comparación de cadenas
2, comparación de dos enteros
-lt es menor que
-le es menor o igual que
-eq es igual a
-gt es mayor que
-ne no es igual a
3, juzgue según el archivo permisos
-r tiene permiso de lectura
-w tiene permiso de escritura El permiso
-x tiene permiso para ejecutar
4, juzgar según el tipo de
archivo -f el archivo existe y es un archivo normal
-e el archivo existe
-d el archivo existe y es un directorio

Juicio del control de procesos

si juicio

if [ 条件判断式 ]
then
代码
fi

O varias ramas

if[ 条件判断式 ]
then
代码
elif[ 条件判断式 ]
then
代码
fi

declaración de caso

case $变量名 in "值1")
如果变量的值等于1,则执行程序1
;;
"值2")
如果变量的值等于2,则执行程序2
;;

*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

Código de muestra (recuerde usar la autorización chmod u + x antes de ejecutar en la ruta relativa)

vim ifdemo.sh
#!/bin/bash
#判断"ok"是否等于"ok"
if [ "ok" = "ok" ]
then
	echo "equal"
fi
#23是否大于等于22
if [ 23 -ge 22 ]
then
	echo "大于"
fi
#判断/root/shcode/aaa.txt 目录中的文件是否存在
if [ -f /root/shcode/aaa.txt ]
then
	echo "存在"
fi

Resultados de la
Inserte la descripción de la imagen aquí

vim ifCase.sh
#!/bin/bash
#输入的参数大于等于60,则输出”及格了“,如果小于60,则输出”不及格“
if [ $1 -ge 60 ]
then
	echo "及格了"
elif [ $1 -lt 60 ]
then
	echo "不及格"
fi

Inserte la descripción de la imagen aquí

vim tsetCase.sh
#!/bin/bash
#当命令行参数是1时,输出”周一“,是2时输出”周二“,其他情况输出”other“
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

Inserte la descripción de la imagen aquí

El ciclo de control de procesos

en bucle

Gramática básica 1

for 变量 in 值123...
do
程序
done

Gramática básica 2

for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

Ejemplo de código

vim testFor1.sh
#!/bin/bash
#打印命令行输入的参数
#$*是把参数看成整体,只会输出一句话,$@是把参数区分对待,会输出多次
echo "使用$*获取输入参数"
for i in "$*"
do
	echo "num is $i"
done
echo "================="
echo "使用$@获取输入参数"
for j in "$@"
do
	echo "num is $j"
done

Inserte la descripción de la imagen aquí

vim testFor2.sh
#!/bin/bash
#从1加到输入参数的值输出和
SUM=0
for(( i=1; i<=$1; i++))
do
	SUM=$[$SUM+$i]
done
echo "总和SUM=$SUM"

Inserte la descripción de la imagen aquí
mientras que bucle

Gramática básica

while [ 条件判断式 ]
do
程序
done

Ejemplo de código

vim testWhile.sh
#!/bin/bash
#从命令行输入一个数n,统计从1+..+n的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
	SUM=$[$SUM+$i]
	#i自增
	i=$[$i+1]
done
echo "执行结果=$SUM"

Inserte la descripción de la imagen aquí

leer para leer la entrada de la consola


Parámetros de opción de lectura de sintaxis básica

Opción
-p: especifica el mensaje al leer el valor;
-t: especifica el tiempo de espera (segundos) al leer el valor, si no ingresa el
parámetro dentro de la
variable de tiempo especificada: especifica el nombre de la variable del valor leído

Ejemplo de código

vim testRead.sh
#!/bin/bash
#读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1
echo "NUM1=$NUM1"
#读取控制台输入的NUM2值,在3秒内输入
read -t 3 -p "请输入一个数NUM2=" NUM2
echo "NUM2=$NUM2"

Inserte la descripción de la imagen aquí
Retrasar deliberadamente la primera vez, entrar a tiempo por segunda vez

función

Función del sistema

nombre de base

返回完整路径最后/的部分,常用于获取文件名
basename pathname suffix
删掉所有的前缀包括最后一个'/'字符,然后将字符串显示出来
basename string suffix

sufijo es el sufijo. Si se especifica sufijo, basename eliminará el sufijo en el nombre de ruta o cadena.
Por ejemplo: devuelve la parte "test.txt" de /home/aaa/test.txt y "test"
Inserte la descripción de la imagen aquí
dirname
devuelve el final de la ruta completa / antes La parte, que a menudo se usa para devolver la ruta parte
dirname Ruta absoluta del archivo: elimine el nombre del archivo (parte que no es del directorio) del nombre de archivo dado que contiene la ruta absoluta, y luego devuelva la ruta restante (directorio parte)

Por ejemplo: return / home / aaa de /home/aaa/test.txt
Inserte la descripción de la imagen aquí

Función personalizada

Gramática básica

[function] funname[()]
{
    
    
	Action;
	[return int;]
}	

Llamar directamente escribir el nombre de la función: funname [value]

Por ejemplo: Calcule la suma de dos parámetros de entrada.

vim testFun.sh
#!/bin/bash
#定义函数
function getSum(){
    
    
	SUM=$[$n1+$n2]
	echo "SUM=$SUM"
}
#读取参数
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用函数
getSum $n1 $n2

Resultados de la
Inserte la descripción de la imagen aquí

Caso de copia de seguridad de la base de datos

1. Haga una copia de seguridad de la base de datos zzf en / data / backup / db a las 2:30 de la mañana todos los días.
2. El mensaje de aviso correspondiente se puede dar al principio y al final de la
copia de seguridad. 3. El archivo después de la copia de seguridad requiere la hora de la copia de seguridad como el nombre del archivo y empaquetado en .tar La forma de .gz, como: 2021-03-12_230201.tar.gz
4. Mientras realiza la copia de seguridad, compruebe si hay un archivo de base de datos del que se hizo una copia de seguridad hace 10 días y elimínelo si hay uno

Ingrese a este directorio para crear el archivo correspondiente

cd /usr/sbin
vim mysql_db_backup.sh
#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=zzf123456
#备份的数据库名
DATEBASE=zzf

#创建备份目录,如果不存在,就创建,这里的&&类似于then
[ ! -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 "备份数据库${DATEBASE}成功~"

Los resultados
Inserte la descripción de la imagen aquí
van al directorio donde puede encontrar que hay una
Inserte la descripción de la imagen aquí
programación de tareas de unión de archivos de respaldo

crontab -e
30 2 * * * /usr/sbin/mysql_db_backup.sh

referencia

https://www.bilibili.com/video/BV1Sv411r7vd

Supongo que te gusta

Origin blog.csdn.net/qq_43610675/article/details/113433514
Recomendado
Clasificación