zoukankan      html  css  js  c++  java
  • shell参考


     shell:弱类型编程语言,即变量在使用之前不需要事前声明,甚至不区分类型。

    1.变量类型:

      脚本在执行时会启动一个子shell进程,命令行中启动的脚本会继承当前shell环境变量,系统自动执行的脚本(非命令行启动)就需要自我定义需要各种环境变量。
      环境变量:export VARNAME=VALUE,作用域为当前shell进程及其子进程,同样可以再变量声明完之后再用export导出变量如:export VARNAME,不用加$符号
      本地变量:VARNAME=VLAUE,作用域为整个bash进程
      局部变量:local VARNAME=VALUE,作用域为当前代码段
      位置变量:
          $1,$2,...${10},${11},引用脚本的第几个参数
          $_ ,最后一个参数
      特殊变量:
          $?,上一个命令执行状态返回值。程序状态返回值,0正确执行;1-255:错误执行;1,2,127系统预留
          $0,脚本的路径名,可以使用dirname $0获取脚本路径名,basename $0获取文件名。
          $#,脚本的参数个数
          $*,脚本的所有参数,”$*“代表"$1 $2 $3"
          $@,脚本的所有参数,"$@"代表"$1" "$2" "$3"
      位移变量:shift,所有参数的位置依次向左移动,并$#减1
      变量子串:
          ${变量},就相当于$变量
          ${#变量},求变量内容的字符长度
          ${变量:m},从第m个字符截取变量内容直到结尾
          ${变量:m:n},在变量内容中从第m个字符开始截取共n个字符
          ${变量#m*n},在变量内容中的开头开始删除最短匹配m*n
          ${变量%m*n},在变量内容中的结尾开始删除最短匹配m*n
          ${变量##m*n},在变量内容中的开头开始删除最长匹配m*n
          ${变量%%m*n},在变量内容中的结尾开始删除最长匹配m*n
          ${变量/m/n},替换变量内容中的第一个m为n
          ${变量//m/n},替换变量内容中的所有m为n
      扩展变量:
          ${变量:-word},如果变量值为空,则返回word,但不代替变量的值
          ${变量:=word},如果变量值为空,则返回word,并替代变量的值
          ${变量:?word},如果变量值为空,则word作为标准错误输出,否则输出变量的值
          ${变量:+word},如果变量值为空,则什么都不做,否则替代变量的值

      数组:
          静态数组:array=(1 2 3)
          动态数组:array=($(ls))
          为数组赋值:array[1]=333
          打印数组所有元素:${array[@]} 或 ${array[*]}
          打印数组长度:${#array[@]} 或 ${#array[*]}
          打印单个元素:${array[i]}
          循环遍历数组列表:
            for n in ${array[*]}
              do
                echo $n
              done

    2.使用变量 

      引用变量:${VARNAME},在不影响调用变量名称时,括号可省略
      撤销变量:unset VARNAME,不用加上$符号
      查看变量:set,查看当前shell中的变量,不用加任何参数符号。想要查看当前shell中的环境变量可以使用printenv、env、export都可以
      追加变量:VARNAME=${VARNAME}AAA,可以在原有变量中追加变量进来,可以加在原有变量前也可以在后面。在不影响变量名称时可以不加大括号{}

    3.条件判断

      条件测试表达式: [  表达式  ]、[[   表达式   ]],有空格

      逻辑运算,在[[ ]]中使用
        逻辑与:&& ,当第一个条件为真时,后面条件继续执行;当第一个条件为假时,后面不执行
        逻辑或:| | , 当第一个条件为假时,后面条件继续执行;当第一个条件为真时,后面不执行

      组合条件,在[ ]中使用
        -a:与 $$
        -o:或||
        !:非

        if [  $# -eq 1 -a $1 -eq 2  ]

      整数比较
        -eq:测试两个整数是否相等。如 $a -eq $b
        -ne:测试两个整数是否不等。
        -gt:测试一个数是否大于另外一个数,可以使用>,但在[ ]中需要加上
        -lt:测试一个数是否小于一个数,可以使用<,但在[ ]中需要加上
        -ge:大于等于
        -le:小于等于 

      文件测试,有时变量要加""
               -e FILE:测试文件是否存在
               -f FILE:测试文件是否问普通文件
               -d FILE:测试指定路径是否为目录
               -r FILE:测试当前用户对指定文件是否有读取权限
               -w FILE:测试当前用户对指定文件是否有写权限
               -x FILE:测试当前用户对指定文件是否有执行权限
          -s FILE:文件存在且大小不为0
          -L FILE:文件存在,且为链接文件
          f1  -nt  f2:文件f1比f2新为真
          f1  -ot  f2:文件f1比f2旧为真

      字符串比较
        "STRING1" == "STRING2":测试是否相等,相等为真,不等为假,可以使用=代替,注意等号两端的空格
        "STRING1" != "STRING2":测试是否不等,不等为真,相等为假,注意两端的空格
        ><:大于或小于
        -n 字符串:测试指定字符串是否为空,空为真,不空为假,这个不好用,[ $a == "" ]这样判断是否为空
        -z 字符串:测试指定字符串是否不空,不空为真,空为假

      条件测试
        test  测试表达式 
        [ 测试表达式 ]
        [[  测试表达式  ]]
        ((  测试表达式  ))

      多分支if语句  

      if [ 判断条件 ];then
                       statements1
                       ……
             elif [ 判断条件2 ];then
                       statements2
                       ……
             elif [ 判断条件3 ];then
                       statements3
                       ……
            else
                       statements4
                       ……
             fi
    

      case语句  

        case "变量" in
          值1)
            指令1
            ;;
          值2)
            指令2
            ;;
          *)
            指令3
            ;;
        esac
    

       for循环

      for 变量 in 列表;do
          循环体
      done
    

       while循环:适用于循环次数未知的情况,要有退出条件  

     while [ 条件 ];do
                       循环体
           done

       seq循环

      `seq [起始数 [步进长度]] 结束数`   seq 1 1 100   从1开始,每次增长1,至100结束。默认起始和步长都为1

      用while循环读取文件

    1.exec方法
    exec <FILE
    while read line
    do
        CMD
    done
    
    2.cat方法
    cat FILE | while read line
    do
        CMD
    done
    
    3.while结尾处
    while read line
    do
        CMD
    done<FILE

      select打印菜单列表

    PS3="这里是要打印的循环提示符,跟select是一对"
    select  变量  in  列表
    do
        CMD
    done  

      循环控制

    break n:省略n表示退出当前循环,n表示退出循环的层数
    continue n:省略n表示忽略后面剩余代码,直接进行下一次循环
    exit n:退出当前shell程序,并返回值
    return n:函数返回值
    

      

    4.算术运算

      a**b:幂运算
        3**3=27

      let整数算术运算表达式
        let C=$A+$B
      $[算术运算表达式]
        C=$[$A+$B]
      $((整数算术运算符))     整数运算的常用运算符
        C=$(($A+$B))
      expr 整数算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
        C=`expr $A + 2`   echo $?   可以判断A是否为整数

      let sum+=$i   -->  sum=sum+i
        let i+=1 -->  let i++ -->  i=i+1   (+=,-+,*=,/=,%=)

      bc:计算器,scale=2代表保留两位小数
        echo `seq -s "+" 5`=`seq -s "+" 5 | bc`
        1+2+3+4+5=15 

    5.读入

    read -p “提示信息” -t 超时时间 变量名

    6.正确错误符号

    首先需要加载系统方法函数,action关键字

    7.函数

    function  函数名() {
           指令
           return n
    }
    
    或
    function 函数名 { 指令 return n } 或
    函数名() { 指令 return n }

     8.生成随机数的方法

    通过RANDOM函数做加密后,用cut截取
    echo $RANDOM | md5sum  | cut -c 8-10
    
    通过openssl
    openssl rand -base64 8
    

    9.脚本调试

    bash
      -n:不会执行该脚本,仅查询脚本的语法问题,并给出错误提示
      -v:先将脚本的内容打印出来
      -x:调试模式

    在脚本中内容中添加set -x开启调试功能,set +x关闭调试功能

    脚本内容
    set -x
    脚本内容
    set +x
    脚本内容
    

    10.屏蔽键盘信号

    可以使用trap -l查看都有哪些信号,常用信号为:
    
    HUP 1:挂起
    INT 2:中断,相当于ctrl+c
    QUIT 3:退出,相当于ctrl+
    ABRT 6:终止
    ALRM 14:报警
    TERM 15:终止
    TSTP 20:停止,相当于ctrl+z
    
    屏蔽ctrl+c键:trap "[这里可以是命令,也可以是空]" 2 [3 4 5后面可以跟多个]
    恢复ctrl+c键:trap ":" 2
    

      

    批量生成随机字符串  

    #!/bin/sh
    source /etc/init.d/functions
    FILEPATH=/test
    FILENAME=test
    [ -d $FILEPATH ] || mkdir -p $FILEPATH
    for i in `seq 10`
    do
            NAME=$(openssl rand -base64 40 | sed s@[^a-z]@@g | cut -c 1-10)
            touch $FILEPATH/${NAME}_$FILENAME
            action "`echo $FILEPATH/${NAME}_$FILENAME is created`" /bin/true
    done
    

    重定向

    #标准输出重定向到/dev/null,错误输出到控制台
    find / -name passwd > /dev/null    
    
    #标准输出和错误输出都重定向到/dev/null      
    find / -name passwd > /dev/null 2>&1
    find / -name passwd &> /dev/null
    find / -name passwd >& /dev/null
    
    #错误输出重定向到/dev/null,标准输出到控制台
    find / -name passwd 2> /dev/null
    

      

      

      

      

    初学linux,每学到一点东西就写一点,如有不对的地方,恳请包涵!
  • 相关阅读:
    线程安全好文章
    分布式事务
    jvm内存泄漏问题分析过程
    Java8--Lambda表达式
    ZK Watcher 的原理和实现
    JVM垃圾回收算法
    linux常用命令
    Excel常用函数汇总
    Debian 镜像使用帮助
    photon 下载地址
  • 原文地址:https://www.cnblogs.com/forlive/p/8243439.html
Copyright © 2011-2022 走看看