首页 > 系统相关 >Linux Shell编程

Linux Shell编程

时间:2023-02-24 15:57:29浏览次数:65  
标签:文件 Shell 变量 备份 编程 echo Linux 执行 输入

Shell编程

基础语法

  • 脚本格式

    • !/bin/bash 固定开头标识

    • 文件后缀.sh
    • 单行注释#
    • 多行注释:<<! 换行 代码 换行 !
  • 执行脚本

    • 脚本需要赋予可执行权限:chmod u+x 脚本文件路径,直接执行脚本
    • 不用赋予执行权限,直接使用命令:sh 脚本文件路径
  • 变量定义

    • 系统变量:系统中常驻的环境变量

      • echo 可以打印一些变量值,如:echo $HOME $PATH
      • set 可以打印所有的系统变量查看
      • 规则
        • export 变量名=变量值 将shell变量输出为环境变量/全局变量
        • source 配置文件 让修改后的配置信息立即生效(统一配置在/etc/profile文件)
        • echo $变量名 查询环境变量的值
    • 用户自定义变量

      • 规则
        • 字母、数字、下划线注册,不能以数字开头,一般为大写
        • 等号两边不能有空格
      • 语法:变量名=值,如:A=100
      • 销毁变量:unset 变量名
      • 静态变量:readonly变量,不能被unset
      • 输出变量:$A 、${A}或者"$A"
      • 赋值
        • A=`date`右边可以使用反引号,运行里面的命令date,把结果赋值给A
        • A=$(date) 与上同意
    • 位置参数变量

      获取执行脚本时输入的携带参数

      • $n n为数字,从0位置开始获取,0为命令本身字符串,当n大于1位时记得使用${10}来取值
      • $* 获取所有携带参数,不带命令,把参数当成一个整体
      • $@ 获取所有携带参数,不带命令,把参数区分对待,可用于循环
      • $# 获取所有携带参数的个数
    • 预定义变量

      shell设计者预先定义好的变量

      • $$ 获取当前进程-进程号-PID
      • $! 后台运行的最后一个进程的进程号(PID)
      • $? 最后一次执行的命令的返回状态,如果变量为0,证明上个命令正确执行,非零不正确执行,具体非零值由命令自己决定
  • 运算符

    • 基本语法
      • "$((运算式))" 或 "$[运算式]" 或者 expr m + n
      • 如果使用expr运算符间要有空格,如果希望expr的结果赋给某个变量,使用反引号括起来,同时expr运算一般分布运算,一次做一个加减乘除
      • + 假发 - 减法 \* 乘法 / 除法 % 取余
  • 条件判断

    • 基本语法
      • [ condition ] 注意condition前后有空格(非空为真,$?进行验证的时候,0为真)
      • 应用
        • [ szl ] 返回true
        • [] 返回false
        • [ condition ] && echo OK || echo notOK 条件condition为真执行&&后面语句,不满足执行||后面语句
    • 常用判断条件
      • 字符串比较
        • =
      • 两个整数比较
        • -lt 小于
        • -le 小于等于
        • -eq 等于
        • -gt 大于
        • -ge 大于等于
        • -ne 不等于
      • 文件权限判断
        • -r 有读取的权限
        • -w 有写的权限
        • -x 有执行权限
      • 文件类型判断
        • -f 文件存在且是一个常规文件
        • -e 文件存在
        • -d 文件存在并是一个目录
      • 应用
        • “ok” 是否等于 “ok” 使用 =
        • 23是否大于等于22 使用 -ge
        • /root/shcode/aaa.txt目录的文件是否存在 使用-f
  • 流程控制

    • 分支:

      #单分支
      if [ condition ]
      then
      	echo "执行代码"
      fi
      
      #多分支
      if [ condition ]
      then
      	echo "执行代码1"
      elif [ condition ]
      then
      	echo "执行代码2"
      fi
      
      #case语句
      case $变量名 in
      "值1")
      echo "执行代码1"
      ;;
      "值2")
      echo "执行代码2"
      ;;
      *)
      echo "都不满足执行"
      ;;
      esac
      
    • 循环

      #方式1
      for 变量 in 值1 值2 值3...
      do
      程序
      done
      #如循环输出
      for i in "$@"
      do
      	echo "num is $i"
      done
      
      -------------------------------------
      #方式2
      for((初始值;循环控制条件;变量变化))
      do
      程序
      done
      #如求和
      SUM=0
      for((i=1;i<=100;i++))
      do
      	SUM=$[$SUM+$i]
      done
      echo "sum=$SUM"
      
      -------------------------------------
      #while循环
      while[ condision ]
      do
      程序
      done
      #如根据输入数据求和
      SUM=0
      i=0
      while [ $i -le $1 ]
      do
      	SUM=$[$SUM+$i]
      	i=$[$i+1]
      done
      echo "执行结果$SUM"
      
  • 输入

    • read (选项)(参数)

      • 选项 -p 指定读取值时的提示符;
      • 选项 -t 指定取值时等待的时间(秒),如果没有在指定的时间内输入,就不在等待
      • 参数 变量名 指定读取值的变量名
      • 应用
      # 案例1 读取控制台输入一个NUM1值
      read -p "请输入一个数NUM1=" NUM1
      
      # 案例2 读取控制台输入的一个NUM2值,在10秒内输入
      read -t 10 -p "请输入一个数NUM2,限制时间10秒" NUM2
      
  • 函数

    • 系统函数:预先定义好的函数,可以直接调用

      • basename [pathname] [suffix] 取出路径中的文件名,如果命令放上扩展名,则把扩展名一并去掉
      • dirname [文件绝对路径] 取出文件名中除去文件名的部分,只剩下目录部分
    • 自定义函数

      • 基本语法

        [ function ] funname[()]
        {
        	Action
        	[return int;]
        }
        
        # 调用直接写函数名:funname [值]
        # 案例:计算输入两个参数的和(动态获取),getSum
        
        # 定义函数
        function getSum(){
        	SUM=$[$n1+$n2]
        	echo "两数和:$SUM"
        }
        
        # 输入两个数
        read -p "输入n1=" n1
        read -p "输入n2=" n2
        
        #调用函数
        getSum $n1 $n2
        
        

综合案例

需求

1.每天凌晨2:30备份 数据库Szl 到/data/backup/db

2.备份开始和备份结束能够给出提示信息

3.备份的文件要求以备份时间为文件名,并打包成.tar.gz文件

4.备份后检查是否有10天前的备份,如果有将其删除

实现

  • 安装部署mysql,并建立数据库
  • 备份数据脚本建立
  • 设定任务调度

备份数据库脚本

#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=long+3977878
#备份的数据库名称
DATABASE=Szl

#创建备份目录,不存在则创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

#备份数据库,并指定输出文件进行压缩
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATATIME}/$DATATIME.sql.gz

#将文件处理成tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATATIME}
#删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}

#删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE}成功"

标签:文件,Shell,变量,备份,编程,echo,Linux,执行,输入
From: https://www.cnblogs.com/shaozelong/p/17151747.html

相关文章

  • Linux LCD驱动
    一、Linux下LCD驱动简析1.与裸机的异同在Linux中应用程序最终也是通过操作RGBLCD的显存来实现在LCD上显示字符、图片等信息,但是Linux系统的内存管理......
  • 如何判断linux 显示服务器是xorg (x11) 还是wayland
    背景大家好,我是Tarzan。在使用Linux操作系统的时候我们需要注意自己的显示服务是xorg还是wayland模式,因为有很多软件或者框架不支持或者兼容性不好,大部分都支持x11,但是w......
  • Linux 安装Redis-6.2.5
    https://blog.csdn.net/weixin_40750377/article/details/122110481https://blog.csdn.net/weixin_44353336/article/details/114601513#1.3、编译并安装Redis......
  • Go语言并发编程:对进程、线程、协程和并发、并行的理解
    Go语言并发编程:进程、线程、协程和并发、并行的理解一、进程和线程对操作系统进程和线程以及协程的了解,可以看看我前面的文章:对进程、线程和协程的理解以及它们的区别......
  • linux上安装宝塔
    CentOS未安装宝塔,直接安装宝塔纯净版命令 yuminstall-ywget&&wget-Oinstall.shhttp://v7.hostcli.com/install/install_6.0.sh&&shinstall.sh已安装官方版......
  • linux下oracle自动备份
    备份脚本1vi/backup/oracledata/ordatabak.sh#!/bin/bashexportORACLE_BASE=/u01/oracleexportORACLE_HOME=$ORACLE_BASE/oracleexportORACLE_SID=orclexportPATH=......
  • linux中断处理总结
    ARM64中断处理过程:https://www.daodaodao123.com/?p=146上文总结了ARM64裸机中断处理的详细过程,这里主要总结下linux中断处理相关内容;0.为什么有中断?中断,本质上是外设发......
  • vscode中使用powershell显示分支名
    https://blog.csdn.net/weixin_43932597/article/details/125000557windowspowershell(或windowsterminal)启动前会先执行一个.ps1的配置文件,通过修改此文件可以对powers......
  • Xshell与Xfpt连接服务器(windows server)
    在服务器中下载OpenSSH下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases下载后解压: 在解压后的文件夹内打开cmd 在其中输入命令,安装SSHpowersh......
  • linux 中 利用 awk 数组 依据指定列的字符统计累计总长度
     001、[root@PC1test]#lsa.txt[root@PC1test]#cata.txt##测试数据abc3dbe7ade8zbc4ade1[root@PC1test]#awk'{array[$2]+=......