Shell脚本学习

会有一股神秘感。 提交于 2019-11-29 12:24:13

Shell脚本学习

参考视频:https://www.bilibili.com/video/av21303002/?p=60

1、 编写第一个脚本文件

  • 必须以#! /bin/bash 开头,表示是用bash进行解析脚本的
  • shell文件必须有可执行权限 —chmod 744 myShell.sh
  • 执行方法:./myShell.sh 也可以绝对路径/home/fongfiafia/shell/myShell.sh 执行
  • 多行注释:<<! !

2、shell的变量

  • 分类:分为系统变量和用户自定义变量

    • 系统变量:$HOME 你可以echo

    例子: echo “PATH = $PATH”

    例子:set查看当前shell中所有变量

  • 定义变量

    • 定义变量: 变量 = 值 (等号两边不能有空格)

      例子:

      A=10

      ECHO “A = $A”

    • 撤销变量: unset 变量

    • 声明静态变量: readonly 不能unset

    • 可以把一个变量提升为全局变量

  • 定义变量的规则

    • 和java一样不能数字开头
    • 等号两侧不能有空格
    • 变量名称一般习惯大写
  • 怎么讲运行结果返回给变量

    • 反引号:A = 'ls -l /home'
    • MY_DATE=$(date)
  • 设置环境变量

    • 例子:etc/profile 里面有一个环境变量,myshell.sh要使用它。必须先执行

    ​ source etc/profile 让它生效:

    ​ 具体写法:在profile下面写:

    ​ TOMCAT_HOME=/OPT/XX

    ​ EXPORT TOMCAT_HOME

    ​ 然后保存退出,执行source /etc/profile

    ​ 这样就可以直接执行echo $TOMCAT_HOME的值

    ​ 最后我们可以在我们的shell文件中,直接echo $TOMCAT_HOME了

  • 读取命令行的参数:就是这种形式:./shell.sh 10 20 其中10,20就是参数

    • $n 输出文件名,参数。。。
    • $* 输出所有参数,但是参数是一个整体
    • $@ 输出所有参数,但是参数之间是分开的
    • $# 表示参数个数##
  • 预定义变量:shell设计者实现已经定义好的变量。这里介绍了几个

    • $ $ 当前进行的pid

    • $! 后台运行的最后一个进程号pid

    • $?

    • 这里的例子写到了一个东西,我在一个脚本里面执行另外一个脚本,要知道一个脚本的执行其实相当于一个进程,在一个脚本中执行,其实就是后台进程。执行的命令方法是:

      ./myshell.sh &

3、运算符:有两种方式

  • $[运算式]

    • $[(2+3)*4] 推荐这么写
  • expr m - n 运算符之间要有空格:同时乘法和除法取余数都要加上\

  • 写一个例子:计算输入脚本的参数之和:

    SUM=$[$1+$2]

4、条件判断

[ condition ] 注意前后都有一个空壳

  • 两个整数的比较:(前面的- 也要写)
    • -lt 小于 little
    • -gt 大于 great
    • -le 小于等于
    • -ge 大于等于
    • = 字符串的比较
  • 文件的
    • -e 文件是否存在 if [ -e /root/xxx.txt ]

5、流程控制

  • if 判断

    • if then fi
    • if then elif then fi
  • case语句

    • case $1 in
      
      "1")
      
      	echo "周一"
      
      ;;
      
      "2")
      
      	echo "周二"
      
      *)    -----------相当于default
      
      	echo "都匹配不上"
      
      esac
      
      
  • for循环

    • for i in$*”   //这个$*是位置变量哦! 他是一个整体哦!!
      
      do 
      
      		echo "the num is $i"  //这样是只输出一条语句
      
      done
      
      因此其实我们最常用的是 $@
      
      
    • for((i=1;i<100;i++))    //在这个上面要先 SUM=0
      
      do
      
      		sum =$[$sum+$i]
      
      done
      
      echo "sum=$sum"
      
      
  • while 后面要加一个空格

    从命令行输入一个数n,计算1+2+3+。。。+n

    • while [ $i -lt $1 ]      //在这个上面要先 SUM=0   i=0
      
      do
      
      		sum=$[$sum+$i]
      
      		i=[$i+1]
      
      done
      
      echo "$sum"
      
      

5、读取控制台输入read

  • 参数
    • read -p “请输入一个数num=” NUM1 //进入阻塞,等待用户输入一个值给NUM1
    • read -t 10 -p "请输入一个数num=” NUM1 //进入阻塞,等待用户输入一个值给NUM1,必须在10秒内

6、函数

  • 系统函数

    • basename 返回完整路径最后的部分“/”后面的内容
  • 自定义函数

    function getSum(){
    
    	SUM=[$n1+$n2]
    
    	echo "$SUM"
    
    }
    
    read -p "请输入第一个值" n1
    
    read -p "请输入第二个值" n2
    
    getSum $n1 $n2
    
    

7、案例学习

要求:每天凌晨2:10备份数据库ztguiguDB到/data/backup/db中

备份开始和结束能够给出相应的提示信息

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

在备份的同时,检查是否有10天前备份的数据库文集那,如果有就删除

#!/bin/bash
#备份的路径
BACKUP=/data/backup/db
#获取当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)

echo "开始备份,备份的路径是$BACKUP/$DATETIME.tar.gz"

#主机
HOST=localhost
DB_USER=root
DB_PWD="123"

#创建备份的路径
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
DATABASE=atguiguDB
#执行mysql的备份数据库指令
mysqldump -u$DB_USER -p$DB_PWD --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz

#打包
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME

#删除10天前的文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;

最后需要建一个进程任务crontab -e

10 2 * * * /home/fongfiafia/shell/mysql_db_backup.sh
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!