zoukankan      html  css  js  c++  java
  • shell编程

    一、Shell介绍

    shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

    硬件---内核---shell----外层应用程序

    二、shell脚本的执行方式

    '''
    - 格式要求:
    	1.脚本以 #!/bin/bash 开头
    	2.脚本要有可执行权限
    
    - 执行方式
    方式一:
    	1.赋予脚本文件的+x权限
    	2.执行脚本
    方式二:(推荐使用第一种)
    bash 脚本文件路径
    sh 脚本路径
    '''
    

    三、shell变量

    '''
    shell变量介绍:
       - shell变量分为系统变量和用户自定义变量
       - 系统变量:$HOME,$PWD,$SHELL,$USER 等等
       - 显示当前shell中所有变量: set
    
    shell变量定义:
    1.定义变量:
    变量名 = 值
    
    2.撤销变量
    unset 变量名
    
    3.声明静态变量(不能unset)
    readonly 变量名
    
    
    变量名的定义规则:
    1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头
    2.等号两侧不能有空格
    3.变量名称一般习惯大写
    
    
    将命令的返回值赋值给变量
    A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量
    A=$(ls -la) 等价于反引号
    '''
    
    myshell.sh
    #! /bin/bash
    echo "user=$USER"
    echo "path=$PATH"
    
    A=10
    echo "A=$A"
    unset A
    echo "A=$A"
    
    readonly A=10
    echo "A=$A"
    unset A	# 会报错,静态变量不能unset
    
    MY_DATE=`date`
    echo "date=$MY_DATE"
    
    RESULT=$(ls -l)
    echo $RESULT
    
    

    四、设置环境变量

    '''
    基本语法:
    	- export 变量名=变量值 (将shell变量输出为环境变量)
    	- source 配置文件  (让修改后的配置信息立即生效)
    	- echo $变量名
    '''
    
    /etc/profile
    ....
    # 自定义环境变量
    TOMCAT=/opt/tomcat
    export TOMCAT
    
    # 多行注释
    :<<!
    TOMCAT=/opt/tomcat
    export TOMCAT
    !
    

    五、位置参数变量

    '''
    介绍:当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。比如:./myshell.sh 100 200这个就是一个执行shell命令行,可以在myshell 脚本中获取到参数信息。
    
    基本语法:
    	- $n 功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,10及10以上的参数需要用大括号例如:${10}
    	- $* 功能描述:这个变量代表命令行中的所有参数,$*把所有参数看成一个整体(不包含$0)
    	- $@ 功能描述:这个变量也代表命令行中所有参数,不过$@把每个参数区分对待
    	- $# 功能描述:这个变量代表命令行中所有参数的个数
    
    
    
    '''
    
    应用实例:

    1.编写一个shell脚本postion.sh,在脚本中获取命令行的各个参数信息

    #! /bin/bash
    echo $*
    echo $@
    echo "参数个数=$#"
    

    六、预定义变量

    '''
    基本介绍:就是shell设计者实现已经定好的变量,可以直接在shell脚本中使用。
    
    基本语法:
    	$$ 功能描述:当前进程的进程号(PID)
    	$! 功能描述:后台运行的最后一个进程的进程号(PID)
    	$?功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值不是0,则证明上一个命令执行不正确。
    '''
    
    案例使用
    #! /bin/bash
    
    
    echo "当前进程号为:$$"
    
    ./myshell22.sh &
    echo "后台运行的最后一个进程号:$!"
    
    echo "最后一个命令:$?"
    
    

    七、运算符

    '''
    基本介绍:
    	学习如何在shell中使用各种运算操作
    基本语法:
    	1)"$((运算式))" 或 "$[运算式]"
    	2)expr m + n (注意expr运算符之间要有空格)
    	3)expr m - n
    	4)expr * / %  乘,除,取余
    '''
    
    使用案例
    #!/bin/bash
    
    RESULT=$[3 + 2]
    echo $RESULT
    
    # 第一种方式()
    RESULT1=$(((2+3)*4))
    echo $RESULT
    
    # 第二种方式[]
    RESULT2=$[(2+3)*4]
    echo  $RESULT2
    
    
    # 第三种方式expr
    
    TEMP=`expr 10 + 20`
    RESULT3=`expr $TEMP * 10`
    echo $RESULT3 
    

    八、条件判断

    '''
    基本语法:
    [ condition ] (注意conditon前后都要空格)
    # 非空返回true,可使用$?验证(0位true,>1位false)
    
    
    常用判断条件:
    1.两个整数比较
        = 字符串比较
        -lt 
        -le
        -eq
        -gt
        -ge
        -ne 不等于
    2.按照文件权限进行判断
    	-r 
    	-w
    	-x
    3.按照文件类型进行判断
    	-f 文件存在并且是一个常规的文件
    	-e 文件存在
    	-d 文件存在并且是一个目录
    '''
    
    应用实例
    #!/bin/bash
    
    #1.“ok”是否等于“ok”
    if [ "ok" = "ok" ]
    then
            echo "equal"
    fi
    
    
    #2.23是否大于等于22
    if [ 23 -gt 22 ]
    then
            echo "大于"
    fi
    
    #3.判断某个文件是否存在
    if [ -e /root/shell/aaa.txt ]
    then
            echo "存在"
    fi
    

    九、流程控制之if

    '''
    基本语法:
    if [ condition ];then
       程序
    fi
    # 或者
    if [ condition ]
    then
       程序
    elif [ condition ]
    then
       程序
    fi
    '''
    
    使用案例
    # 60分和60分以上及格,60分以下不及格
    if [ $1 -ge 60 ]
    then
            echo "及格了"
    elif [ $1 -lt 60 ]
    then
            echo "不及格"
    fi
    

    十、流程控制之case

    '''
    基本语法:
    
    case $变量 in
    "值1")
    变量值==值1的时候执行的语句
    ;;
    "值2")
    变量值==值2的时候执行的语句
    ;;
    *)
    如果变量的值都不是以上值时执行的语句
    ;;
    
    '''
    
    使用案例
    #!/bin/bash
    
    # 命令行参数是1输出周一,是2输出周二,其他情况输出other
    case $1 in
    "1")
    echo "周一"
    ;;
    "2")
    echo "周二"
    ;;
    *)
    echo "other"
    ;;
    esac
    

    十一、流程控制之for循环

    '''
    基本语法1:
    for var in val1 val2 val3
    do
    	程序
    done
    
    基本语法2:
    for ((初始值;循环控制条件;变量变化))
    do
    	程序
    done
    '''
    
    使用案例1
    #!/bin/bash
    # 打印命令行输入的参数
    # $*的情况
    for i in "$*"
    do
            echo "the num is $i"
    done
    
    # $@的情况
    for j in "$@"
    do
            echo "the num is $j"
    done
    
    
    使用案例2
    #!/bin/bash
    SUM=0
    for ((i=0;i<=100;i++))
    do
            SUM=$[$SUM+$i]
    done
    echo "$SUM"
    
    

    十二、流程控制之while循环

    '''
    基本语法
    while [ condition ]
    do
    	程序
    done
    '''
    
    使用案例
    #!/bin/bash
    
    # 输入一个n,输出1+2...+n的值
    i=0
    SUM=0
    # 这里的[]是条件判断,所以左右需要空格
    while [ $i -le $1 ]
    do
            SUM=$[$SUM+$i]  #这里的[]是运算式
            i=$[$i+1]
    done
    echo "$SUM"
    
    

    十三、READ读取控制台输入

    '''
    基本语法:
    read (选项)(参数)
    
    选项:
    -p:指定读取值时的提示符
    -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入就不再等待了
    
    参数:
    变量:指定读取值时的变量名
    '''
    
    使用案例
    #!/bin/bash
    
    read -p "请输入一个数num1=" NUM1
    echo "你输入的值是num1=$NUM1"
    
    read -t 10 -p  "请输入一个数num2=" NUM2
    echo "你输入的值是num2=$NUM2"
    
    

    十四、函数

    '''
    shell编程和其它编程语言一样,有系统函数,也可以自定义函数。
    简单介绍两个系统函数:
    
    1.basename
    功能:返回完整路径最后/的部分,场用于获取文件名
    basename[pathname][suffix]
    basename[string[suffix]] (功能描述:basename命令会删除掉所有的前缀包括最后一个'/'字符,然后将字符串显示出来)
    
    2.dirnane
    功能:返回完整路径最后/的前面的部分,常用语返回路径部分
    dirname 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录的部分))
    
    dirname /home/test.txt     ===> /home
    '''
    
    使用案例
    #!/bin/bash
    
    basename /home/aaa.txt
    basename /home/aaa.txt .txt
    

    十五、自定义函数

    '''
    []里的内容可写可不写
    [ function ]funcname[()]
    {
    	Action;
    	[return int;]
    }
    调用直接写函数名:funcname
    '''
    
    使用案例
    #!/bin/bash
    
    
    function getSum()
    {
            SUM=$[$n1+$2];
            echo "和是=$SUM"
    #       return int $SUM;
    }
    
    read -p "请输入第一个数n1" n1
    read -p "请输入第二个数n2" n2
    
    # 调用getSum
    getSum $n1 $n2
    
    
    

    综合使用案例

    '''
    1.每天凌晨2:10备份数据库atguiguDB 到/data/backup/db
    2.备份开始和备份结束能够给出相应的提示信息
    3.备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如
    	2020-02-02_230201.tar.gz
    4.在备份的同事,检查是否有10天前备份的数据库文件,如果有就将其删除
    
    '''
    
    #!/bin/bash
    
    BACKUP="/data/backup/db"
    DATETIME=$(date "+%Y-%m-%d_%H%M%S")
    
    echo "=========开始备份========"
    echo "=========备份的路径是$BACKUP/$DATETIME.tar.gz"
    
    # 主机
    HOST=localhost
    # 用户名
    DB_USER=root
    # 密码
    DB_PWD=root
    
    # 要备份的数据库名
    DATABASE=testDB
    
    # 创建备份的路径
    [ -d "$BACKUP/$DATETIME" ]&& mkdir -p "$BACKUP/$DATETIME"
    
    # 执行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 {} ;
    
    echo "=========备份文件成功=========="
    
  • 相关阅读:
    【上班摸鱼】聊天机器人定时发送微博热搜
    【上班摸鱼】企业微信、钉钉、飞书自动提醒基金预估加减仓
    python HTMLTestRunner单元测试报告
    python自动发送邮件
    python unittest模块使用
    python logging模块使用
    python编码安全规范
    python EXCEL处理
    【转】bootstrap, boosting, bagging 几种方法的联系
    【转】GBDT(MART) 迭代决策树入门教程 | 简介
  • 原文地址:https://www.cnblogs.com/Ghostant/p/12572179.html
Copyright © 2011-2022 走看看