shell实例练习+详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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! \\nplease 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"】

   

 案例三

   系统监控

  系统的性能对于开发来说无所谓,对于运维来说确十分重要。自动化监控系统中的性能十分重要。我们以监控单任务cpu消耗为例。

  需求:监控系统中cpu消耗超过40%的任务(实际工作中,top一下就知道了)

  > 任务脚本:找到对应的任务(main、share、conf、log、mail)

  > 实时监测(Shell)

 

  没想好,怎么写!以后再说吧!

 

原创博客,转载请注明出处!欢迎邮件沟通:[email protected]
















以上是关于shell实例练习+详解的主要内容,如果未能解决你的问题,请参考以下文章

7个shell脚本实例--shell脚本练习必备

Linux shell脚本编程详解及应用实例

shell练习-sort排序详解

SHELL用法九(awk练习)

第14章练习,shell脚本编程实例-1

SHELL小练习