zoukankan      html  css  js  c++  java
  • shell脚本

    一 什么是shell script

    将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令,再加上些智能(条件/流控)控制,就变成了智能化脚本了。

    二 变量

    part1 为何要有变量

    程序的运行就是一些列状态的变量->用变量值的变化去表示

     

    part2 变量命名规则

    以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.

    最好遵循下述规范:

    1.以字母开头

    2.使用中划线或者下划线做单词的连接

    3.同类型的用数字区分

    4.对于文件最好加上拓展名 例如: sql_bak.tar.gz,log_bak.tar.bz2

     

    part3 系统变量

    set  显示所有变量

    env  环境变量

     

    part4 变量赋值

    varname=value

    echo $varname

    删除变量 unset varname

    part5 常用系统变量

    PATH

    PWD  ccho $PWD查看位置

    LANG

    HOME

    HISTSIZE    echo $HISTSIZE    查看限制保存历史记录的条数

          vim /etc/profile 修改保存限制保存历史记录的条数 

          HISTSIZE = 800

    PS1   定义linux界面命令行每行前面的格式

    IFS

    域分隔符 是空格,换行,TAB键的合集

    part6 全局变量与局部变量

      export money=1000  定义一个全局变量

      爹子辈的全局变量子字辈可以用

      子字辈的全局变量爹字辈不能用

    part7 定义变量名的边界

    [root@MiWiFi-R3-srv ~]# rest_mem=20

    [root@MiWiFi-R3-srv ~]# echo ${rest_mem}%

    20%

    part 8 数据类型

    bash中的变量无须声明,拿来就用.默认的变量都会是字符类型,还可以有数字类型,普通的脚本,这两种类型够用了

    运算符

    part1 算术运算符

        +

    -

    *

    /

    %

    $[ ]进行数学运算

    part2 关系操作

    <

    >

    <=

    >=

    ==

    !=

    &&

    ||

    [  ] 在括号内进行关系比较,要用-gt大于,-ge 大于等于,-eq等于,-le小于等于,-lt小于,-ne不等于,同test

    -gt is greater than,
    -ge is greater than or equal to,
    -eq is equal to,
    -le is less than or equal to,
    -lt is less than,
    -ne is not equal to

      !取反,-a和,-o或  

    (())在括号内进行关系比较,要用<,>,<=,>=

    part3 赋值运算符

    =

    +=

    *=

    /=

    %=

    part4 shell里的所有计算器
      $[]       y=$[$x+1]  echo y

      (())    ((y=x+1))  echo y

      $(())   echo  $((y=x+1))   直接将计算结果输出

      expr    expr $x +$y  直接输出结果

    浮点运算

      先装bc包  yum install bc -y

      echo   "scale=2;30/1000"  | bc -l  保存两位小数

    part5 测试操作

      命令执行后会返回到一个系统变量中 $?
      如果$?值为0 表示命令执行成功 否则为失败

      part5-1、测试文件状态

      -d  文件存在,是一个目录  test -d /etc

      -s  文件存在,还是一个非空文件

      -e  文件存在

      -f  文件存在,是一个普通文件

      -h或者L  文件存在,是一个链接文件

      -w  文件存在,当前用户有写权限

      -r 文件存在,当前用户有读权限

      -x 文件存在,当前用户有执行权限

      part5-2、字符串测试
      =   两个字符串相等
      !=  两个字符串不相等
      -z  空串
      -n  非空串

      part5-3、测试数值
      -eq 等于
      -ne 不等于
      -gt 大于
      -lt 小于
      -ge 大于等于
      -le 小于等于

    四 流程控制

    part1分支结构

    if  [条件]

      then

    elif  [条件]

      then

    else  [条件]

      then

    fi

    #!/bin/bash
    #指定解释器
    var='/etc/init.d'
    if [ -d $var ]
        then
            echo "$var is directory"
    elif [ -b $var ]
        then
            echo "$var is block"
    elif [ -f $var ]
        then
            echo "$var is regular file"
    else
            echo 'unknow'
    fi

    写完脚本,给执行权限chmod +x

    ./ 脚本文件   执行脚本

     

    向脚本传递参数

    #test.sh
    echo $0
    #取文件名
    echo $
    1 echo $2 echo $3 echo ${11} #传递参数的第十一个参数 echo '$$' $$ #脚本运行的ID号
    echo
    '$*' $* echo '$@' $@ echo '$#' $#
    #总共有多少个参数 echo
    '$?' $? ''' 测试:python test.sh 1 2 3 4 5 6 7 8 9 10 11 输出结果: ./test.sh 1 2 3 11 $$ 14312 $* 1 2 3 4 5 6 7 8 9 10 11 $@ 1 2 3 4 5 6 7 8 9 10 11 $# 11 $? 0 '''

    在文本中命令行模式,%s /aaa/bbb/g   #将文件中的aaa全部改为bbb

    将脚本拷贝到/usr/bin下,在任何位置直接脚本名就可以运行,如果要固化,就要在/etc/profile内改路径

    ps aux |grep nginx |grep -v 'grep'     过滤nginx,然后把本身的grep命令产生的nginx过滤掉

    part2 循环结构

    part2-1 while循环

    while (条件)

    do

      动作

    done

    需要无限循环时我们会选择while :

    #!/bin/bash
    var1=AAA
    var2=BBB
    var3=CCC
    while :
    do
        clear
        echo -e "A:${var1}
    B:${var2}
    C:${var3}"
    #-e 将
    换行输出
        temp=$var1
        var1=$var2
        var2=$var3
        var3=$temp
        sleep 1
    done

    part2-2 for循环 

    ping -c1 192.168.16.188   ping一次这个IP地址

    ping -c1 192.168.16.188 &> /dec/null   ping后的显示结果扔进黑洞文件

    检查内网存活的IP
        #!/bin/bash
    
        for i in {1..254}
        doping -c1 192.168.16.$i &> /dev/null
           if [ $? -ne 0 ]
           then
            echo "192.168.16.$i is available"
             else
              echo "192.168.16.$i is unavailable" &> /dev/null    done

    part2-3 case语句

    case $uname in
     root)
    #判断uname是否匹配root
    echo "welcome $uname" ;; #执行结束
    seker)
    echo "welcome $uname" ;; default) echo "welcome $uname" ;; *) #全部没匹配成功
    echo "no user $uname" esac

    函数

    交互shell中的函数

    function abc(){
    
        echo 'aaa';
    
        echo 'bbbb'; 
    
    }
    
     abc #调用

     脚本中的函数

    1.函数定义

    shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数    

    定义函数的格式:

    function-name (){        

    command1        

    ........    

    }

    或 function function-name(){ #函数名前面多了个function关键字

    command1        

    ........    

    }

    2.函数调用    

    以下是一个函数的脚本实例:

    #!/bin/bash    

    #hello    

    function hello(){       #声明函数

    echo "Hello!"     #函数的主体,输出"Hello!"  

    }  #函数结束

    hello #调用函数  

    3.参数传递  

    向函数传递参数就像在脚本是使用变量位置$1,$2,$3...$9

    以下是一个传递参数的实例:

    #!/bin/bash  

    #hellofun  

    function hello(){      

    echo "Hello! The first parameter is '$1'."  

    }  

    hello good  

    #该脚本执行的结果是: Hello! The first parameter is 'good'.

    4.函数文件  

    保存函数的文件,用以上的例子写成一个函数文件如下:

    #!/bin/bash  

    #hellofunction  

    function hello(){    

    echo "Hello!"    

    return 1  

    }

    上面的hellofunction文件就是一个函数文件,可通过另一个脚本来调用

    #!/bin/bash  

    #hellof  

    . hellofunction#注意点和hellofunction之间有个空格

    hello

    5.载入和删除  

    用set查看已载入的函数  

    用unset function-name 取消载入  

    举例如下:

    #!/bin/bash  

    #hellof  

    . hellofunction  

    unset hello  

    hello   #因为已经取消载入。。所以会出错

    6.函数返回状态

    #!/bin/bash  

    #hellofun  

    function hello(){    

    echo "Hello! The first parameter is '$1'."    

    return 1  

    }  

    hello  

    echo $?#输出返回的状态值(一般成功是返回0,其它值为失败) 

  • 相关阅读:
    Java 泛型学习四 自动擦除
    Java 泛型学习三 通配符
    ava的动态性支持学习七 方法句柄调用的性能对比
    Java 泛型学习一 泛型概念
    Java中正则Matcher类的matches()、lookAt()和find()的区别
    Java 泛型学习五 泛型擦除带来的不自然
    Java I/O 流的简单介绍及示例
    Java 泛型学习二 泛型的限制
    Java 泛型学习六 泛型类型系统
    字节存储机制:bigedian 和 littleendian
  • 原文地址:https://www.cnblogs.com/domestique/p/6747007.html
Copyright © 2011-2022 走看看