O estudo do Linux observa a programação de dois scripts de shell

Programação de script de shell

Requisitos de formato de script

1. O script começa com #! / Bin / bash
2. O script precisa ter permissões de executável

O primeiro shell script

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

Métodos de execução comuns de scripts

1. (Digite o caminho absoluto ou relativo do
script ) Primeiro, dê a permissão + x ao script e, em seguida, execute
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
2. Sh + script, não há necessidade de dar permissão ao script + x, apenas execute-o diretamente
Insira a descrição da imagem aqui

Variáveis ​​Shell

1. As variáveis ​​no shell do Linux são divididas em variáveis ​​de sistema e variáveis ​​definidas pelo usuário
2. Variáveis ​​de sistema: $HOME $PWD $SHELL $USERetc.
3. Exibir todas as variáveis ​​no shell atual: conjunto
4.${ }中放的是变量,例如echo ${PATH}取PATH变量的值并打印,也可以不加括号比如$PATH

Definição de variáveis ​​de shell

Sintaxe básica
1. Definir variável: nome da variável = valor
2. Variável não configurada: variável não configurada
3. Declarar variável estática: variável somente leitura, não pode ser desconfigurada

inscrição

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"

Regras para saída de
Insira a descrição da imagem aqui
variáveis ​​de shell

1. Os nomes das variáveis ​​podem consistir em letras, números e sublinhados, mas não podem começar com números.
2. Não pode haver espaços em ambos os lados do sinal de igual
3. Os nomes das variáveis ​​geralmente são maiúsculos.

Atribuir o valor de retorno do comando a uma variável

1 、

A=`date`

Execute o comando interno e retorne o resultado para a variável A

2. A = é $(date)equivalente a usar crases

Por exemplo, adicione a seguinte declaração no exemplo acima

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

O resultado da saída
Insira a descrição da imagem aqui
definiu variáveis ​​de ambiente

Sintaxe básica
1. Exportar nome da variável = valor da variável: exibir variáveis ​​shell como variáveis ​​de ambiente
2. Arquivo de configuração de origem: fazer com que as informações de configuração modificadas tenham efeito imediato
3. Nome da variável de eco: consultar o valor das variáveis ​​de ambiente

Depois que a variável de ambiente é definida, ela pode ser usada no programa de shell

Comentários de várias linhas para scripts de shell

:<<!
内容
!

Variável de parâmetro posicional

Quando executamos um script de shell, se queremos obter as informações de parâmetro da linha de comando, podemos usar variáveis ​​de parâmetro posicionais, como: ./myshell.sh 100 200, esta é uma linha de comando para executar o shell, que pode estar no script myshell Obtenha informações de parâmetro

Sintaxe básica
$ n: n é um número, $ 0 representa o próprio comando, $ 1- $ 9 representa o primeiro ao nono parâmetros, parâmetros acima de dez, parâmetros acima de dez precisam ser colocados entre colchetes, como $ {10}

$ *: representa todos os parâmetros na linha de comando e trata todos os parâmetros como um todo

$ @: também representa todos os parâmetros na linha de comando, mas trata cada parâmetro de maneira diferente

$ #: Representa o número de todos os parâmetros na linha de comando

Por exemplo: escreva o script myshell.sh

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

Insira o comando e obtenha as
Insira a descrição da imagem aqui
variáveis ​​predefinidas

As variáveis ​​definidas pelo designer de shell antecipadamente podem ser usadas diretamente no script de shell

Sintaxe básica
$$: o número do processo do processo atual

$ !: O número do último processo em execução em segundo plano

$ ?: O status de retorno do último comando executado. Se o valor desta variável for 0, prova que o comando anterior foi executado corretamente, se o valor desta variável não for 0, prova que o comando anterior foi executado incorretamente.

Por exemplo, escreva o script preVar.sh

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

O resultado da execução é
Insira a descrição da imagem aqui

Operação aritmética

Sintaxe básica
1 $((运算式))ou $[运算式]
2, expr m + nse você quiser atribuir o resultado de expr a uma variável, use crase
3, multiplicação de expr *

Aplicativo
Calcule o valor de (2 + 3) * 4 para
encontrar a soma dos dois parâmetros da linha 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 do
Insira a descrição da imagem aqui

Julgamento condicional

Gramática básica

[ 内容 ]

Retorne verdadeiro se não estiver vazio, use $? Para verificar (0 é verdadeiro,> 1 é falso)

Condições de julgamento comumente usadas
1, = comparação de sequência
2, comparação de dois inteiros
-lt é menor que
-le é menor ou igual a
-eq é igual a
-gt é maior que
-ne não é igual a
3, julgue de acordo com o arquivo permissões
-r tem permissão de leitura
-w tem permissão de gravação A permissão
-x tem permissão para executar
4, julgar de acordo com o tipo de
arquivo -f arquivo existe e é um arquivo regular
-e arquivo existe
-d arquivo existe e é um diretório

Julgamento de controle de processo

se julgamento

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

Ou multi-branch

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

declaração de caso

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

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

Código de amostra (lembre-se de usar a autorização chmod u + x antes de executar no caminho relativo)

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 do
Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

O ciclo de controle de processo

para loop

Gramática Básica 1

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

Gramática Básica 2

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

Exemplo 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

Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui
loop while

Gramática básica

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

Exemplo 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"

Insira a descrição da imagem aqui

leia para ler a entrada do console


Parâmetros de opção de leitura de sintaxe básica

Opção
-p: especifica o prompt ao ler o valor;
-t: especifica o tempo de espera (segundos) ao ler o valor, se você não inserir o
parâmetro dentro da
variável de tempo especificada: especifique o nome da variável do valor lido

Exemplo 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"

Insira a descrição da imagem aqui
Atrase deliberadamente na primeira vez, insira o tempo pela segunda vez

função

Função do sistema

nome de base

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

sufixo é o sufixo. Se o sufixo for especificado, o nome de base removerá o sufixo do nome do caminho ou da string.
Por exemplo: retorne a parte "test.txt" de /home/aaa/test.txt e "test"
Insira a descrição da imagem aqui
dirname
retorne fim do caminho completo / antes A parte, freqüentemente usada para retornar a parte do caminho
nome do diretório Caminho do arquivo absoluto: remove o nome do arquivo (parte não do diretório) do nome de arquivo fornecido contendo o caminho absoluto e, em seguida, retorna o caminho restante (diretório papel)

Por exemplo: return / home / aaa of /home/aaa/test.txt
Insira a descrição da imagem aqui

Função personalizada

Gramática básica

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

Chame diretamente o nome da função de gravação: funname [valor]

Por exemplo: Calcule a soma dos dois 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 do
Insira a descrição da imagem aqui

Caso de backup de banco de dados

1. Faça backup do banco de dados zzf para / data / backup / db às 2:30 da manhã todos os dias.
2. A mensagem de prompt correspondente pode ser fornecida no início e no final do
backup. 3. O arquivo após o backup requer a hora do backup como o nome do arquivo e compactado em .tar A forma de .gz, como: 2021-03-12_230201.tar.gz
4. Durante o backup, verifique se há um arquivo de banco de dados do qual foi feito backup há 10 dias , e exclua-o se houver um

Entre neste diretório para criar o arquivo correspondente

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}成功~"

Os resultados
Insira a descrição da imagem aqui
vão para o diretório onde você pode descobrir que existe um arquivo de backup para
Insira a descrição da imagem aqui
juntar tarefas de agendamento

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

referência

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

Acho que você gosta

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