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参数
    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
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,678评论 0 11
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,085评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,128评论 2 34
  • 本文全面系统地介绍了shell脚本调试技术,包括使用echo, tee, trap等命令输出关键信息,跟踪变量的值...
    liuzg0734阅读 889评论 0 14