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,每学到一点东西就写一点,如有不对的地方,恳请包涵!
  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/forlive/p/8243439.html
Copyright © 2011-2022 走看看