• Shell编程


    在Linux中经常用到Shell脚本,简单学习下Shell编程吧。

    Shell 编程

    变量

    注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
    使用一个定义过的变量,只要在变量名前面加美元符号即可。

    #!/bin/bash
    your_name="Lee"
    echo $your_name
    echo ${your_name}  
    #变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

    Shell 字符串

    #!/bin/bash
    str="abcdefg"
    #获取字符串长度
    echo ${#str}  #7
    #提取子字符串 从字符串第 2 个字符开始截取 4 个字符
    echo ${str:1:4}  #bcde
    #查找子字符串 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个)
    str="hello world."
    echo `expr index "$str" io` #5

    传递参数

    我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    echo "Shell 传递参数实例!";
    echo "执行的文件名:$0";
    echo "第一个参数为:$1";
    echo "第二个参数为:$2";
    echo "第三个参数为:$3";

    执行

    $ chmod +x test.sh 
    $ ./test.sh 1 2 3
    Shell 传递参数实例!
    执行的文件名:./test.sh
    第一个参数为:1
    第二个参数为:2
    第三个参数为:3

    条件判断

    布尔运算

    运算符描述示例
    ! 非关系,条件结果取反 [ ! 1 -eq 2 ]为true
    -a 与关系,在[]表达式中使用 [ 1 -eq 1 -a 2 -eq 2 ]为true
    -o 或关系,在[]表达式中使用 [ 1 -eq 1 -o 2 -eq 1 ]为true

    逻辑运算

    运算符描述示例
    && 逻辑与,在[[]]和(())表达式中时使用 [[ 1 -eq 1 && 2 -eq 2 ]]为 true; (( 1 == 1 && 2 == 2 ))为true;[ 1 -eq 1 ] && echo yes 如果&&前 面表达式为 true 则执行后面的
    || 逻辑或,在[[]]和(())表达式中时使用 [[ 1 -eq 1 || 2 -eq 1 ]]为 true;(( 1 == 1 || 2 == 2 ))为true;[ 1 -eq 2 ]  ||  echo yes  如果 || 前面表达式为 false 则执行后面的

    if条件

    #!/bin/bash
    if [ $1 -ge 60 ]
    then 
      echo "及格了"
    elif [ $1 -lt 60 ]
    then 
      echo "不及格"
    fi
    
    if [ "ok"="ok" ]
    then
      echo "equal"
    fi
    
    if [ 23 -ge 22 ]
    then
      echo "ok"
    fi
    
    P1="/home/apple/shellCode/position.sh"
    if [ -f $P1 ]
    then
      echo "$P1 存在"
    fi
    
    if [ -x $P1 ]
    then
      echo "$P1 有执行的权限"
    fi

    case

    #!/bin/bash
    
    case $1 in
    "1")
    echo "周一"
    ;;
    "2")
    echo "周二"
    ;;
    "3")
    echo "周三"
    ;;
    *)
    echo "other.."
    ;;
    esac

    for 循环

    #!/bin/bash
    for i in "$*"
    do
      echo "num is $i"
    done
    
    echo "---------------"
    
    for j in "$@"
    do
      echo "num is $j"
    done
    #!/bin/bash
    SUM=0
    #for (( i=1; i <= 100; ++i ))
    for (( i=1; i <= $1; ++i ))
    do
      SUM=$[$SUM + $i]
    done
    echo "$SUM"

    while循环

    #!/bin/bash
    
    SUM=0
    i=1
    while [ $i -le $1 ]
    do
      SUM=$[ $SUM + $i ]
      i=$[$i + 1]
    done
    echo "SUM=$SUM"

    自定义函数

    #!/bin/bash
    
    #定义函数
    function getSum(){
        SUM=$[$n1+$n2]
        echo "SUM=$SUM"
    }
    
    #输入两个数
    read -p "please input a number n1=" n1
    read -p "please input a number n2=" n2
    #调用自定义函数
    getSum $n1 $n2

    例子:(备份mysql数据库)

    vim /usr/sbin/myshell/mysql_db_backup.sh

    #!/bin/bash
    #备份目录
    BACKUP="/data/backup/db"
    #当前时间
    DATETIME=$(date +%Y-%m-%d_%H%M%S)
    echo $DATETIME
    echo "${DATETIME}.sql.gz"
    #数据库地址
    HOST=localhost
    #数据库用户名和密码
    DB_USER=root
    DB_PW=123456
    #备份的数据库名
    DB_NAME=hello01
    
    #创建备份目录,若不存在,就创建
    [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
    
    #备份数据库
    mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DB_NAME} | gzip > "${BACKUP}/${DATETIME}/$DATETIME.sql.gz"
    #将文件夹处理成 tar.gz
    cd ${BACKUP} 
    tar -czvf ${DATETIME}.tar.gz ${DATETIME}
    
    #删除对应的目录
    rm -rf ${BACKUP}/${DATETIME}
    
    #删除10天前的备份文件
    find ${BACKUP} -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
    
    echo "备份数据库$DB_NAME 成功"

    然后用 cron 定时调度 执行该shell脚本

    crontab -e

    进入编辑,每天02:30执行该shell脚本

    30 2 * * * /usr/sbin/myshell/mysql_db_backup.sh

    用 crontab -l  可以查看

  • 相关阅读:
    网上找的面试题-之一
    python里的Join函数
    【转载51CTO】Linux中引号那些事儿
    【面试编程题】巧妙排序:排序只有1,2,3三个元素的数组,不能统计1,2,3的个数。
    [转载]mininet的安装和使用
    Open vSwitch源码阅读【转】及自己的理解【稍后更新】
    7、8月份安排 进度条
    请不要忽视基础小细节
    【编程之美】2.20 程序理解问题
    GDOI2017爆炸记
  • 原文地址:https://www.cnblogs.com/htj10/p/16779523.html
Copyright © 2020-2023  润新知