linux学习笔记-09shell脚本

shell脚本

  • Shell脚本是将各种命令通过逻辑语句组合而成的程序

  • 脚本每行写一条Linux命令。并且一个完整的Shell脚本则应该包括"脚本声明"、"注释信息"和"可执行语句"

    脚本声明(#!):告知系统用何种shell来解释。
    注释信息(#):对可执行语句或程序功能做介绍,可以不写。
    可执行语句:执行的具体命令。
    
  • 执行脚本有三种方法

    脚本文件路径:./Example.sh
    sh脚本文件路径:sh Example.sh
    source脚本文件路径:source Example.sh
    
  • 采用直接执行的方式有时可能权限不够,需要给脚本可执行权限,或者用sh,source执行脚本

    ./Example.sh
    发现权现不够
    chmod u+x Example.sh
    ./Example.sh
    
  • shell可以接受用户输入

    ./Example.sh one two three four five six
    $0    当前执行Shell脚本的程序名。
    $1-9,${10},${11}……    参数的位置变量。
    $#    一共有多少个参数。
    $*    所有位置变量的值。
    $?    判断上一条命令是否执行成功,0为成功,非0为失败。
    

测试语句

  • 测试语句能够测试特定的表达式是否成立,当条件成立时返回值为0,否则返回其他数值

  • 测试语句格式:[ 测试语句 ],其中 中括号两边均有一个空格

  • 测试语句可以分为:文件测试,逻辑测试,整数值比较,字符串比较

文件测试

  • 操作符

    -d    测试是否为目录。
    -f    判断是否为文件。
    -e    测试文件或目录是否存在。
    -r    测试当前用户是否有权限读取。
    -w    测试当前用户是否有权限写入。
    -x    测试当前用户是否有权限执行。
    
  • 示例

    [ -d /etc ]
    $?
    

逻辑测试

  • [ 表达式1 ] 操作符 [ 表达式2 ]

  • 操作符

    &&    逻辑的与,"而且"的意思。
    ||    逻辑的或,"或者"的意思。
    !    逻辑的否。
    
  • 示例

      [ $USER != root ] && echo "user" || echo "root"
    

整数比较

  • 整数值比较:[ 整数1 操作符 整数2 ]

  • 运算符

    -eq    判断是否等于
    -ne    判断是否不等于
    -gt    判断是否大于
    -lt    判断是否小于
    -le    判断是否等于或小于
    -ge    判断是否大于或等于
    
  • 示例

    [ 10 -gt 10 ]
    
    获取当前可用的内存量,并将此值赋值给变量FreeMem:
    FreeMem=`free -m | grep cache: | awk '{print $3}'`
    判断此值是否小与1024(单位是M),若小于则提示内存不足:
    [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
    

字符串比较

  • [字符串1 操作符 字符串2]

  • 运算符

    =    比较字符串内容是否相同。
    !=    比较字符串内容是否不同。
    -z    判断字符串内容是否为空。
    
  • 示例

    [ $LANG != "en.US" ] && echo "Not en.US"
    

条件测试语句

if语句

  • if条件语句

    if 条件测试语句
    then 命令
    fi
    
  • 双分支结构

    if 条件测试语句
    then 命令
    else
    命令
    fi
    
  • 多分支结构

    if 条件测试语句
    then 命令
    elif 条件测试语句
    then 命令
    else
    命令
    fi
    
  • 示例1

    #!/bin/bash
    DIR="/media/cdrom"
    if [ !-e $DIR ]; then
      mkdir -p $DIR
    fi
    
  • 示例2 为了减少用户的等待时间,需要为ping命令追加-c参数代表发送数据包的个数,-i代表每0.2秒发一个数据包,-W则为3秒即超时。而$1为用户输入的第一个参数(IP地址),$?为上一条命令的执行结果,判断是否等于0(即成功)

    ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
    if[ $? -eq 0 ]; then
      ehco "Host $1 is up"
    else
      echo "Host $1 is down"
    fi
    
  • 示例3 根据分数评等级

    #!/bin/bash
    read -p "Enter your socre(0~100)":GRADE
    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
      echo "$GRADE is Excellent"
    elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
      echo "$GRADE is Pass"
    else
      echo "$GRADE is Fail"
    fi
    

for语句

  • 基本命令

    for 变量名 in 取值列表
    do
      命令
    done
    
  • 示例:Shell脚本提示用户输入要设置的密码并赋值给PASSWD变量,从users.txt文件中读入用户名并赋值给UNAME变量, 而查看用户的信息都重定向到/dev/null文件,不显示到屏幕

    #!/bin/bash
    read -p "Enter the user password:" PASSWD
    for UNAME in `cat users.txt`; do
      id $UNAME &> /dev/null
      if [ $? -eq 0 ]; then
        echo "Already exists"
      else
        useradd $UNAME &> /dev/null
        echo $PASSWD | passwd --stdin $UNAME &> /dev/null
        if [ $? -eq 0 ]; then
          echo "Create success"
        else
          echo "Create failture"
        fi
      fi
    done
    
  • 示例:从列表文件中读取主机地址,逐个测试是否在线

    HLIST = $(cat ~/ipadds.txt)
    for IP in HLIST; do
      ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
      if [ $? -eq 0 ]; then
        echo "Host $IP is up"
      else
        echo "Host $IP is down"
      fi
    done
    

while语句

  • 基本语法

    while 条件测试语句
    do
      命令
    done
    
  • 示例:随机生成一个0-999的整数,判断并提示用户输入的值过高或过低

    #!/bin/bash
    
    PRICE = $(expr $RANDOM % 1000)
    TIMES = 0
    echo "商品实际价格为0-999之间,猜猜看是多少?"
    while true; do
      read -p "请输入你猜测的价格数目:" INT
      let TIMES++
      if [ $INT -eq $PRICE ]; then
        echo "恭喜你答对了,实际价格是 $PRICE"
        echo "你总共猜测了 $TIMES 次"
        exit 0
      elif [ $INT -gt $PRICE ]; then
        echo "太高了!"
      else
        echo "太低了!"
      fi
    done
    

case语句

  • 基本语法

    case 变量值 in
      模式1 )
        命令
        ;;
      模式2)
        命令
        ;;
    esac
    
  • 示例

    #!/bin/bash
    read -p "请输入一个字符,并按Enter键确认:" KEY
    case $KEY in
      [a-z]|[A-Z] )
        echo "您输入的是 字母。"
        ;;
      [0-9]) )
        echo "您输入的是 字母。"
        ;;
    esac
    

计划任务服务

一次性任务

  • 一次性任务吧,它是由atd服务/进程来实现的,计划的管理操作是"at"命令

    at <时间>    安排一次性任务
    atq或at -l    查看任务列表
    at -c 序号    预览任务与设置环境
    atrm 序号    删除任务
    
  • 示例

    交互式:
    at 23:30
    at > systemctl start httpd
    at > job 3 at Mon Apr 27 23:30:00 2015
    
    非交互式:
    echo "systemctl start httpd" | at 23:30
    
    查看任务:
    atq
    

长期任务

  • 基本命令

    创建、编辑计划任务:crontab -e [-u 用户名]
    查看计划任务:crontab -l [-u 用户名]
    删除计划任务:crontab -r [-u 用户名]
    
  • 创建参数
    crontab参数
  • 示例,每周1、3、5的凌晨3点25分将/home/wwwroot目录打包备份为backup.tar.gz"

    crontab -e
    25 3 * * 1,3,5 /usr/bin/tar -czvf backukp.tar.gz /home/wwwroot
    

你可能感兴趣的:(linux学习笔记-09shell脚本)