zoukankan      html  css  js  c++  java
  • Linux5.7 Shell基础下

    shell脚本介绍

      脚本语音,可以使用逻辑判断、循环等语法,自定义函数,是系统命令的集合,可以实现自动化运维,能大大增加我们的运维效率。

    shell脚本结构和执行

      开头需要加#!/bin/bash  。意味着下面的语句由bash解析          

      以#开头的行作为解释说明

      脚本的名字以.sh结尾,用于区分这是一个shell脚本

      执行方法有两种
           chmod +x 1.sh; ./1.sh
           bash 1.sh
         查看脚本执行过程 bash -x 1.sh

      查看脚本是否语法错误 bash -n 1.sh     无输出,则无语法错误

    date命令用法

    [root@chy002 ~]# date
    2018年 02月 10日 星期六 04:53:59 CST
    

      年的两种表示

    [root@chy002 ~]# date +%Y
    2018
    [root@chy002 ~]# date +%y
    18
    

      月份的表示,大写%M表示分钟

    [root@chy002 ~]# date +%m
    02
    

      日期的表示

    [root@chy002 ~]# date +%d
    10
    

      年月日,%D表示

    [root@chy002 ~]# date +%D
    02/10/18
    

      组合表示年月日

    [root@chy002 ~]# date +%Y%m%d
    20180210
    [root@chy002 ~]# date +%Y:%m:%d
    2018:02:10
    [root@chy002 ~]# date +%Y-%m-%d
    2018-02-10
    [root@chy002 ~]# date +%Y/%m/%d
    2018/02/10
    [root@chy002 ~]# date +%F
    2018-02-10
    

      小时,分钟,秒的表示

    [root@chy002 ~]# date +%T
    05:14:22
    [root@chy002 ~]# date +%H
    05
    [root@chy002 ~]# date +%M
    14
    [root@chy002 ~]# date +%S
    31
    

      周的表示

    [root@chy002 ~]# date +%w      #表示今天周几
    6
    [root@chy002 ~]# date +%W     #表示今年第多少周
    06
    

      时间戳的表示,距离1970年1月1日0点0分0秒有多少秒

    [root@chy002 ~]# date +%s
    1518211370
    
    [root@chy002 ~]# date -d @1518211370
    2018年 02月 10日 星期六 05:22:50 CST
    
    [root@chy002 ~]# date +%s -d "2017-02-10 05:22:50"
    1486675370
    

      -d表示之前或者之后的日期

    [root@chy002 ~]# date
    2018年 02月 10日 星期六 05:33:11 CST
    [root@chy002 ~]# date -d "-1 month" +%F
    2018-01-10
    [root@chy002 ~]# date -d "-1 year" +%F
    2017-02-10
    [root@chy002 ~]# date -d "-2 day" +%F
    2018-02-08
    [root@chy002 ~]# date -d "+2 week" +%F
    2018-02-24
    [root@chy002 ~]# date -d "+2 hour" +%T
    07:33:04
    

    shell脚本中的变量

    当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
    使用条件语句时,常使用变量    if [ $a -gt 1 ]; then ... ; fi
    引用某个命令的结果时,用变量替代   n=`wc -l 1.txt`
    写和用户交互的脚本时,变量也是必不可少的  read -p "Input a number: " n; echo $n  如果没写这个n,可以直接使用$REPLY
    内置变量 $0, $1, $2…    $0表示脚本本身,$1 第一个参数,$2 第二个 ....       $#表示参数个数
    数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
    

    shell脚本中的逻辑判断

    格式1:if 条件 ; then 语句; fi

    #!/bin/bash
    a=5
    if [ $a -gt 3 ]
    then
            echo ok
    fi

    格式2:if 条件; then 语句; else 语句; fi

    #!/bin/bash
    a=1
    if [ $a -gt 3 ]
    then
            echo ok
    else
            echo no ok
    fi

    格式3:if …; then … ;elif …; then …; else …; fi

    #!/bin/bash
    a=5
    if [ $a -lt 4 ]
    then
            echo "<4"
    elif [ $a -lt 6 ]
    then
            echo "<6 $$ >4"
    else
            echo no ok
    fi

    逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等

    -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意条件语句到处都是空格

    可以使用 && || 结合多个条件

    if [ $a -gt 5 ] && [ &a - lt 10 ]; then

    if [ $b -gt 5 ] || [ $b -lt 3 ]; then

    文件目录属性判断

    [ -f file ]判断是否是普通文件,且存在
    [ -d file ] 判断是否是目录,且存在
    [ -e file ] 判断文件或目录是否存在
    [ -r file ] 判断文件是否可读
    [ -w file ] 判断文件是否可写
    [ -x file ] 判断文件是否可执行

    判断普通文件

    #!/bin/bash
    file="/tmp/1.txt"
    if [ -f $file ]
    then
            echo $file exist
    else
            touch $file
    fi
    

    逻辑判断简写

    file="/tmp/1.txt"
    [ -f $file ] && rm -f $file
    等同于
    if [ -f $file ]
    then
            rm -f $f
    fi
    
    
    [ -f $file ] || touch $file
    等同于
    if [ ! -f $file]
    then
            touch $file
    fi
    

    if特殊用法

    if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样
    if [ -n "$a" ] 表示当变量a的值不为空
    if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样
    if [ ! -e file ]; then 表示文件不存在时会怎么样
    if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…
    [ ] 中不能使用<,>,==,!=,>=,<=这样的符号
    

    是否文件中存在目标的行,但是不输出过滤的该行

    #!/bin/bash
    if  grep -q 'file' file.sh
    then
            echo you
    fi
    

     case判断

    基本格式

    case  变量名  in
        value1)
            command
            ;;
        value2)
            command
            ;;
        *)
            command
            ;;
        esac
    
    #在case程序中,可以在条件中使用 |  ,表示或的意思,比如 
        2|3)
            command
            ;;
    

    for循环

    语法:for 变量名 in 条件; do …; done
    
    for  i  in `seq 1 3` == for i in '123'
    
    for循环以空格或者回车作为分隔符
    
    #!/bin/bash
    sum=0
    for i in `seq 1 100`
    do
        sum=$[$sum+$i]
        echo $i
    done
    echo $sum
    
    
    //文件列表循环
    #!/bin/bash
    cd /etc/
    for a in `ls /etc/`
    do
        if [ -d $a ]
        then
           ls -d $a
        fi
    done
    

    while循环

       注:条件为冒号:时,永为真。等于ture

    语法 while 条件; do … ; done
    
    案例1
    #!/bin/bash
    while :
    do
        load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
        if [ $load -gt 10 ]
        then
            top|mail -s "load is high: $load" asldkfls@11.com
        fi
        sleep 30
    done
    
    
    #!/bin/bash
    while :
    do
        read -p "Please input a number: " n
        if [ -z "$n" ]
        then
            echo "you need input sth."
            continue
        fi
        n1=`echo $n|sed 's/[0-9]//g'`
        if [ -n "$n1" ]
        then
            echo "you just only input numbers."
            continue
        fi
        break
    done
    echo $n
    

    Shell中断退出

      break直接结束本层循环

    #!/bin/bash
    for i in `seq 1 5`
    do
        echo $i
        if [ $i == 3 ]
        then
            break
        fi
        echo $i
    done
    echo aaaaaaa

      continue忽略其之下的代码,直接进行下一次循环

    #!/bin/bash
    for i in `seq 1 5`
    do
        echo $i
        if [ $i == 3 ]
        then
            continue
        fi
        echo $i
    done
    echo $i
    

      exit直接退出shell

    #!/bin/bash
    for i in `seq 1 5`
    do
        echo $i
        if [ $i == 3 ]
        then
            exit
        fi
        echo $i
    done
    echo aaaaaaa
    

    Shell函数

    函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。

    格式: 
    function f_name() 
    {                 
        command             
    }
    函数必须要放在最前面
    
    
    示例1 
    #!/bin/bash
    input() {
        echo $1 $2 $# $0
    }
    
    input 1 a b
    
    
    示例2 
    #!/bin/bash
    sum() {
        s=$[$1+$2]
        echo $s
    }
    sum 1 2
    
    示例3 
    #!/bin/bash
    ip() {
        ifconfig |grep -A1 "$1 " |tail -1 |awk '{print $2}'|awk -F':' '{print $2}'
    }
    read -p "Please input the eth name: " e
    myip=`ip $e`
    echo "$e address is $myip"

    数组

    定义数组 a=(1 2 3 4 5); echo ${a[@]}
     echo ${#a[@]} 获取数组的元素个数 
     echo ${a[2]} 读取第三个元素,数组从0开始
     echo ${a[*]} 等同于 ${a[@]}  显示整个数组
     数组赋值
     a[1]=100; echo ${a[@]}
     a[5]=2; echo ${a[@]} 如果下标不存在则会自动添加一个元素
     数组的删除
     uset a; unset a[1]
    
     数组分片
     a=(`seq 1 5`)
     echo ${a[@]:0:3} 从第一个元素开始,截取3个
     echo ${a[@]:1:4} 从第二个元素开始,截取4个
     echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个
     数组替换
     echo ${a[@]/3/100}
     a=(${a[@]/3/100}) 把第三个数改100
    

     

  • 相关阅读:
    HTTP之get post
    eclipse启动maven项目
    IDEA创建的Web项目配置Tomcat并启动Maven项目
    看django源代码有感
    给计算机系学生的建议
    自己的一点看法
    专业学习的方法
    专业思考2013.2.26
    如何通过看书来学习技术
    技术成长路线
  • 原文地址:https://www.cnblogs.com/chyuanliu/p/8433432.html
Copyright © 2011-2022 走看看