linux之shell编程初步

作者: suxin1932 | 来源:发表于2019-03-07 22:55 被阅读0次
    #################适用于CentOS6##################
    
    #!/bin/bash
    ###############################################
    # 1.测试
    echo "hello world"
    ###############################################
    # 2.常用系统变量
    echo "user=$USER"
    echo "path=$PATH"
    
    # 要执行上面的语句有两种方式
    # 方式1:给用户赋予该脚本的可执行权限
    # chmod 744 文件名(此处是helloworld.sh)
    # 然后 在该文件所在目录下./文件名或者使用该文件的绝对路径执行即可
    
    # 方式2:直接采用sh 文件名执行
    ################################################################################
    # 3.定义一个变量,切记,不可有空格!!!!!!!!!!!
    a=10
    echo a="$a"
    
    # 3.1注销该变量
    unset a
    echo a="$a"
    
    # 3.2声明静态变量: readonly变量,注意:不能unset
    readonly b=11
    echo b="$b"
    # • 定义变量的规则
    # 1) 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
    # 2) 等号两侧不能有空格
    # 3) 变量名称一般习惯为大写
    # • 将命令的返回值赋给变量
    # 1) A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
    result=`ls -l /home`
    echo result="$result"
    # 2) A=$(ls -la) 等价于反引号
    MY_DATE=$(date)
    echo mydate="$MY_DATE"
    
    # 3.3设置环境变量(一般在/etc目录下的profile文件中)
    # 基本语法
    # 1) export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
    # 2) source 配置文件 (功能描述:让修改后的配置信息立即生效)
    # 3) echo $变量名 (功能描述:查询环境变量的值)
    
    # 3.4位置参数变量
    # 介绍
    # 当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
    # 比如 : ./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息
    # 基本语法
    # $n (功能描述: n为数字, $0代表命令本身, $1-$9代表第一到第九个参数,十以上的参数,十以上的参
    # 数需要用大括号包含,如${10})
    # $* (功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体)
    # $@(功能描述:这个变量也代表命令行中所有的参数, 不过$@把每个参数区分对待)
    # $#(功能描述:这个变量代表命令行中所有参数的个数)
    # 举例如下:获取到各个参数
    echo "$0 $1 $2"
    echo "$*"
    echo "$@"
    echo "参数个数是: length of the params are:$#"
    # 测试方式是: ./文件名 参数1 参数2 参数3
    
    # 3.5预定义变量
    # 基本介绍
    # 就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
    # 基本语法
    # $$ (功能描述:当前进程的进程号(PID))
    # $! (功能描述:后台运行的最后一个进程的进程号(PID))
    # $?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正
    # 确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
    echo "当前进程的进程号是$$"
    # 后台运行某文件的方式是: ./a.sh &
    echo "后台运行的最后一个进程的进程号是:$!"
    echo "最后一次的执行命令是否成功: $?"
    ###########################################################
    # 4.shell脚本中的运算符
    # 4.1基本语法
    # 1) “$((运算式))”或“$[运算式]”
    # 2) expr m + n
    # 注意expr运算符间要有空格
    # 3) `expr m - n`
    # 4) expr \*, /, % 乘,除,取余
    
    # • 应用实例
    # 案例1: 计算(2+3) X4的值
    plus=$(((2+1)*3))
    echo "plus=$plus"
    plus1=$[(3+4)/2]
    echo "plus1=$plus1"
    plus2=`expr 3 + 4 \* 5`
    echo "plus2=$plus2"
    # 案例2:请求出命令行的两个参数[整数]的和
    plus3=$[$1+$2]
    echo "plus3=$plus3"
    #########################################################
    # 5.条件判断
    # 判断语句
    # • 基本语法
    # [ condition ](注意condition前后要有空格)
    # 非空返回true,可使用$?验证(0为true, >1为false)
    # 5.1应用实例
    # [ hello ] 返回true
    # [] 返回false
    # [condition] && echo OK || echo notok 条件满足,执行后面的语句
    
    # 5.2常用判断条件
    # 1) 两个整数的比较
    # = 字符串比较
    # -lt 小于
    # -le 小于等于
    # -eq 等于
    # -gt 大于
    # -ge 大于等于
    # -ne 不等于
    # 2) 按照文件权限进行判断
    # -r 有读的权限
    # -w 有写的权限
    # -x 有执行的权限
    # 3)按照文件类型进行判断
    # -f 文件存在并且是一个常规的文件
    # -e 文件存在
    # -d 文件存在并是一个目录
    # 4) 应用实例
    # 案例1: "ok"是否等于"ok"
    # 判断语句:
    if [ "ok" = "ok" ]
    then 
        echo "equal"
    fi
    # 案例2: 23是否大于等于22
    if [ 23 -gt 22 ]
    then
        echo "大于"
    fi
    # 判断语句:
    # 案例3: /root/shell/aaa.txt 目录中的文件是否存在
    # 判断语句:
    if [ -e /home/zhang/shell/a.sh ]
    then
        echo "文件存在"
    fi
    
    # 5.3流程控制之-----if 判断
    # • 基本语法
    # if [ 条件判断式 ];then
    # 程序
    # fi
    # 或者
    # if [ 条件判断式 ]
    # then
    # 程序
    # elif [条件判断式]
    # then
    # 程序
    # fi
    # 注意事项:(1) [ 条件判断式 ],中括号和条件判断式之间必须有空格 (2) 推荐使用第二种方式
    # • 应用实例
    # 案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出 "及格了",如果小于
    # 60,则输出 "不及格"
    if [ $1 -ge 60 ]
    then 
        echo "及格了"
    elif [ $1 -lt 60 ]
    then
        echo "不及格"
    fi
    
    # 5.4流程控制之-----case语句
    # • 基本语法
    # case $变量名 in
    # "值1")
    # 如果变量的值等于值1,则执行程序1
    # ;;
    # "值2")
    # 如果变量的值等于值2,则执行程序2
    # ;;
    # …省略其他分支…
    # *)
    # 如果变量的值都不是以上的值,则执行此程序
    # ;;
    # esac
    # • 应用实例
    # 案例1 :当命令行参数是 1 时,输出 "周一", 是2 时,就输出"周二", 其它情况输出 "other"
    case $1 in
    "1")
    echo "周一"
    ;;
    "2")
    echo "周二"
    ;;
    *)
    echo "other"
    ;;
    esac
    
    # 5.5流程控制之-----for循环
    # • 基本语法1
    # for 变量 in 值1 值2 值3…
    # do
    # 程序
    # done
    # • 应用实例
    # 案例1 :打印命令行输入的参数
    for i in "$*"
    do
        echo "=========$i========="
    done
    for i in "$@"
    do
        echo "---------$i---------"
    done
    # • 基本语法2
    # for (( 初始值;循环控制条件;变量变化 ))
    # do
    # 程序
    # done
    # • 应用实例
    # 案例1 : 从1加到100的值输出显示 [这里可以看出$* 和 $@ 的区别]
    sum=0
    for (( i=1;i<=100;i++ ))
    do sum=$[$sum+$i]
    done
    echo "sum=$sum"
    
    # 5.6流程控制之-----while循环
    # • 基本语法1
    # while [ 条件判断式 ]
    # do
    # 程序
    # done
    # • 应用实例
    # 案例1 :从命令行输入一个数n,统计从 1+..+ n 的值是多少?
    sum1=0
    j=0
    while [ $j -le $1 ]
    do
        sum1=$[$sum1+$j]
        j=$[$j+1]
    done
    echo "sum1=$sum1"
    
    ################################################################################
    6.read读取控制台输入
    # 基本语法
    # read(选项)(参数)
    # 选项:
    # -p:指定读取值时的提示符;
    # -t:指定读取值时等待的时间(秒) ,如果没有在指定的时间内输入,就不再等待了。。
    # 参数
    # 变量:指定读取值的变量名
    # 应用实例
    # 案例1: 读取控制台输入一个num值
    read -p "请输入一个数字no1=" no1
    echo "你输入的数数字no1是$no1"
    # 案例2: 读取控制台输入一个num值,在10秒内输入。
    read -t 10 -p "请在10秒内输入一个数字no2=" no2
    echo "你输入的数字no2是$no2"
    
    ################################################################################
    # 7.函数
    # 7.1系统函数
    # 7.1.1 basename基本语法
    # 功能:返回完整路径最后 / 的部分,常用于获取文件名
    # basename [pathname] [suffix]
    # basename [string] [suffix] (功能描述: basename命令会删掉所有的前缀包括最后一个(‘/’)
    # 字符,然后将字符串显示出来。
    # 选项:
    # suffix为后缀,如果suffix被指定了, basename会将pathname或string中的suffix去掉。
    # • 应用实例
    # 案例1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
    basename /home/aaa/test.txt
    basename /home/aaa/test.txt .txt
    
    # 7.1.2 dirname基本语法
    # 功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
    # dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),
    # 然后返回剩下的路径(目录的部分))
    # • 应用实例
    # 案例1:请返回 /home/aaa/test.txt 的 /home/aaa
    dirname /home/aaa/test.txt
    
    # 7.2自定义函数
    # • 基本语法
    # [ function ] funname[()]
    # {
    # Action;
    # [return int;]
    # } 
    # 调用直接写函数名: funname [值]
    # • 应用实例
    # 案例1: 计算输入两个参数的和, getSum
    function getSum(){
        s=$[$n1+$n2]
        echo "$s"
    }
    read -p "请输入一个数字n1=" n1
    read -p "请输入一个数字n2=" n2
    # 调用函数
    getSum $n1 $n2
    
    
    
    # 8.需求分析
    # 1) 每天凌晨 2:10 备份 数据库 atguiguDB 到 /data/backup/db
    # 2) 备份开始和备份结束能够给出相应的提示信息
    # 3) 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:
    # 2018-03-12_230201.tar.gz
    # 4) 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
    ###################################step1:脚本文件编写:放在/usr/sbin/mysql_db.sh文件中###############################
    #完成数据库的定时备份。
    #备份的路径
    BACKUP=/data/backup/db
    #当前的时间作为文件名
    DATETIME=$(date +%Y_%m_%d_%H%M%S)
    #可以输出变量调试
    #echo ${DATETIME}
    
    echo "=======开始备份========"
    echo "=======备份的路径是 $BACKUP/$DATETIME.tar.gz"
    
    #主机
    HOST=localhost
    #用户名
    DB_USER=root
    #密码
    DB_PWD=root
    #备份数据库名
    DATABASE=atguiguDB
    #创建备份的路径
    #如果备份的路径文件夹存在,就使用,否则就创建
    [ ! -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 "=====备份文件成功==========="
    
    ###################################step2:调用定时任务mysql_db.sh文件中###############################
    crontab -e命令进入,然后i键编辑
    2 * * * /usr/sbin/mysql_db.sh
    esc键退出编辑,:wq保存并退出即可
    

    Shell中判断语句if中-z至-d的意思

    [ -a FILE ] 如果 FILE 存在则为真。
    
    [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
    
    [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
    
    [ -d FILE ] 如果 FILE 存在且是一个目录则为真。
    
    [ -e FILE ] 如果 FILE 存在则为真。
    
    [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
    
    [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
    
    [ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
    
    [ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
    
    [ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
    
    [ -r FILE ] 如果 FILE 存在且是可读的则为真。
    
    [ -s FILE ] 如果 FILE 存在且大小不为0则为真。
    
    [ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
    
    [ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
    
    [ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
    
    [ -x FILE ] 如果 FILE 存在且是可执行的则为真。
    
    [ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
    
    [ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
    
    [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
    
    [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
    
    [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
    
    [ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
    
    [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
    
    [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
    
    [ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
    
    [ -z STRING ] “STRING” 的长度为零则为真。
    
    [ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
    
    [ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
    
    [ STRING1 != STRING2 ] 如果字符串不相等则为真。
    
    [ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
    
    [ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
    

    在中括号中,判断变量的值, 加不加双引号的问题

     [ -n "$pid" ]  单对中括号,变量必须要加双引号
     [[ -z  $pid ]]  双对中括号,变量不用加双引号
    

    [[ ]] 双对中括号,是不能使用 -a 或者 -o的参数进行比较的
    [ ] 可以使用 -a -o的参数,但是必须在 [ ] 中括号内,判断条件

    [ 5 -lt 3  -o  3 -gt 2 ]    #或者条件成立
    [5 -lt 3 ] -o [ 3 -gt 2]    #或者条件, 这个不成立,因为必须在中括号内判断
    

    如果想在中括号外判断两个条件,必须用&& 和 || 比较

    [5 -lt 3 ] ||  [ 3 -gt 2]        #成立
    [5 -gt 3 ] &&  [ 3 -gt 2]    #成立
    

    当判断某个变量的值是否满足正则表达式的时候,必须使用[[ ]] 双对中括号

    相关文章

      网友评论

        本文标题:linux之shell编程初步

        本文链接:https://www.haomeiwen.com/subject/gnpkpqtx.html