zoukankan      html  css  js  c++  java
  • shell实例练习+详解

    想着将Shell与Python和Java等脚本比较比较,当一有这个念头我就放弃了。这太侮辱Shell了。(哭笑脸!)

    作为一个程序员,Linux那是最基本要求。而shell脚本有时候也会显示它在Linux中独特的魅力,让我们一起来学习学习吧!!!!

    我爱学习!!

    案例一

    打印九九乘法表

      >循环语句(for)

      >变量计算(加减乘除)

    语句:

    1 for i in $(seq 9); do  for j in $(seq $i); do echo -n "$i*$j=$(($i*$j))  "; done;echo ""; done

    结果:

    说明:

    >for循环:for arg in Range;do CMD;done

      循环常见场景:

      ##1、有限数字(用空格隔开)
      for i in 1 2 3 4 5;do echo $i ;done 
      ##2、序列数据(seq 开始 步长 最后) ---步长默认1
      for i in $(seq 1 3 100); do echo $i ;done
      ##3、命令结果(默认空格为分隔符)
      for i in `cat 01.txt`;do echo $i ;done
      for i in `ls | grep "heh"` ;do echo $i ;done
      ##4、语法循环(类似C,注意为双括号,分号隔开)
      for ((i=1;i<3;i+=2));do echo i ;done
      for ((;;);do echo"无限循环";done
      ##5、其他情况
      具体情况,具体分析

    >算术运算

      shell中涉及的算术计算与其他语言一样(或其他语言与shell一样,顺序请强迫症患者忽略),有加(+)、减(-)、乘(*)、除(/)、取模()、取余(%)、求幂(**)。

    shell中有好几种方法实现运算。

      方法一,中括号:[...]   ##中括号完成算术执行,需通过"$"引用打印出来

        echo $[2+3]

      方法二,双小括号:((...))    ##等同于let 

        echo $((3+2))    ##echo $"let 3+2"

      方法三,let、expr表达式

        let i= 3+2;echo $i;

        echo $(expr $i * 3);(运算符之间要有空格,否则全部不执行运算全部输出)(expr还有其他高级应用,暂且不说)

      注意:bash不支持浮点类型计算,以上都只能实现整数运算。浮点的运算需要使用bc/awk

        echo 0.5*4-0.2|bc;

        echo $(awk  'BEGIN{print 0.5*4-0.2}'); 

    案例二

    循环打印日期(可指定起始日期或默认日期),并返回天数

      > 循环

      >if判断

      >date日期

     1 #!/bin/bash
     2 
     3 ##判断变量,是否为空(如果没有或只有一个,进行默认赋值)
     4 if [ "$1" == "" ] 
     5 then
     6     start_date=`date -d "today last month" "+%Y%m01"`
     7     end_date=`date -d "today" "+%Y%m%d"`
     8 else
     9     if [ "$2" == "" ]
    10     then
    11         start_date=`date -d "$1" "+%Y%m%d"`
    12         end_date=`date -d "today" "+%Y%m%d"`
    13     fi
    14 fi        
    15 
    16 ##判断两个变量是否有问题(可扩展,进行可用性识别)
    17 if [ "$start_date" -gt "$end_date" ]    
    18 then
    19     echo "ERROR! 
    please input a right date"
    20     exit
    21 fi
    22 
    23 ##通过循环,返回日期值(包含开始和结束日期,闭区间)
    24 for i in `seq 0 100000`
    25 do
    26     t_date=`date -d "${start_date} +$(($i+1)) day" "+%Y%m%d"`
    27     echo $t_date
    28     cnt_days=$i
    29     
    30     ##如果循环到当天,就退出
    31     if [ $t_date == $end_date ]
    32     then
    33         break
    34     fi
    35 done
    36 
    37 echo "The days between two date is "+$cnt_days+" !"

    >if判断

    格式:if 条件 ; then cmd ; elif cmd ; else cmd ; fi

    条件格式要求:中括号两端有至少一个空格,如 [ **** ] ;判断符中间也需要空格,否则执行虽然不报错但不是我们要的结果!

      常用的条件:

      数值判断

      数字1 -eq 数字2   两数相等为真 (equal)
      数字1 -ne 数字2   两数不等为真 (not equal)
      数字1 -gt  数字2   数字1大于数字2为真 (great than)
      数字1 -ge 数字2   数字1大于等于数字2为真 (great equal)
      数字1 -lt   数字2   数字1小于数字2为真 (less than)

      数字1 -le  数字2   数字1小于等于数字2为真 (less equal)

      文件判断

      -e  文件是否存在(目录或普通文件,exists) 【示例:[ -e ./02.txt ] && echo "hehe",这是一种简版的if判断,先执行中括号内部命令,true则执行&&后的命令;】

      -f  是否为普通文件 (file)【示例:[ -f ./02.txt ] && echo "heh"】

        -d  是否为目录文件(directory)【示例:[ -d ./111 ] && echo "heh"】    

      -r  文件权限:是否可读(read) 【示例:[ -r ./111 ] && echo "heh"】

      -w  文件权限:是否可写(write) 【示例:[ -w ./111 ] && echo "heh"】

      -x  文件权限:是否可执行(execute) 【示例:[ -x ./111 ] && echo "heh"】

      字符段判断

      ==  是否相同(测试“=”也可以)【[ "hehe" == "xizao"  ] && echo "good"】

      !=  是否不等  【[ "hehe" != "xizao"  ] && echo "good"】

      -z  是否为空(长度是否为0)  【[ -z "" ] && echo "good"】

       

     案例三

      对重要的系统数据进行备份,备份周期为一个月(20170901增加)

     1 #!/bin/bash
     2 
     3 #备份日期
     4 date_log=`date "+%Y%m%d"`
     5 
     6 #加入备份root中的数据
     7 tar -czvf /home/shj/bak/root_${date_log}_bak.tar.gz  /root 
     8 
     9 #删除一个月之前的数据
    10 find /home/shj/bak -name "root_*_bak" -mtime +30 -exec rm -rf {} ;

      通过crontab -e,做成定时任务每日零点零分执行(假如我的文件名为:shj_bak.sh)

    1 #分 时 天 月 周 cmd
    2 0 0 * * * sh shj_bak.sh

     案例四

      今天遇到同事不知道怎么了就把crontab任务删除了,需要进行恢复(20170901)

      1、通过cron日志查看有那些任务(如果这些日志在期间内没有执行过,将无法收集)

        cat /var/log/cron | grep "shj" | awk -F“(” '{print $3}' | sed 's/(//g' | sort | uniq -c  # cat查询数据后以管道符传给grep,匹配shj用户,结果给到awk,“(”作为分隔符,打印第三列,并用sed将“)”替换掉,排序后取出唯一值,并显示执行了多少次。  

      2、知道了命令和执行次数,就需要考虑执行频率了。找到日志开始时间和结束时间

        cat /var/log/cron | grep "shj" | awk '{print $1 " " $2}' | sort | uniq  >mytmp

        echo "日志开始时间为:`head -1 mytmp`,,结束时间为:`tail -1 mytmp`"

      3、重写crontab

    案例五

      通过shell做hive、MySQL的定时任务。(当前工作不少都是这个)(20170906)

      shell写hive的定时任务(路径默认为当前家目录)

        1、创建你需要的脚本,例:vim  hive_perday.sh

        2、编写shell脚本

    #!/bin/bash
        
        if [ "$1"==""  ]  #$1如果不加"",当$1为空会报错。假如这个有个日期参数。
        then
            para1=`date "+%Y&m%d"`
        else
            para1=$1
        fi
    
    #写你的hive语句(假如需要参数)
        hive_sql="select * from mytable where col>'para1'"
    #执行你的hive,并将结果输出到指定位置(含错误),将&1替换为/dev/null则不输出错误
        hive -e "{$hive_sql}" >~/file 2>&1
    #执行hive文件
        hive -f hive_file
    
    #写入你的MySQL语句
    mysql_sql="select * from table where *****"
    mysql -host10.10.10.10 -utest -p**** -P3306 -e "{$mysql_sql}"

        3、将你的脚本部署到定时任务中,如果是长期执行则用crontab,如果只执行一次用at。

    案例六

      Linux文本处理(今天将csv导入MySQL时,发现多了一列以及表头)。于是,我们用awk、sed处理一下吧。(20171011补充)

      ]$ awk -F, '{print $1","$3","$4","$5}' filename >new_file.csv    处理掉多余的列

      ]$ sed -n '2,$p' new_file.csv > final.csv

      ]$ mysql -h10.**** -u*** -p****

      mysql > load data local infile 'final.csv' insert into table(a,b,c,d); 

      

    原创博客,转载请注明出处!欢迎邮件沟通:shj8319@sina.com

  • 相关阅读:
    mysql int类型 int(11) 和int(2)区别
    mysql 用户 登陆 权限相关
    【转】ext4+delalloc造成单次写延迟增加的分析
    write 系统调用耗时长的原因
    【转】通过blktrace, debugfs分析磁盘IO
    win7 wifi热点
    【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap
    pdflush进程介绍与优化【转】
    How to find per-process I/O statistics on Linux
    oom_killer
  • 原文地址:https://www.cnblogs.com/SunHuaJ/p/7374686.html
Copyright © 2011-2022 走看看