• SHELL脚本进阶


    一、读取参数

    $0 程序名称
    $1 第一个参数
    $2 第二个参数,依次类推
    可以使用 basename 来读取程序名称:basename $0

    可以使用 dirname 来读取第一个参数的目录:dirname $0

    在使用参数之前应该尽量测试参数 [ -n "$1" ] 由于需要将参数作为字符串因此添加引号

    特殊的参数变量:
    $# 表示参数个数, ${!#} 读取最后一个参数(由于不能在大括号中使用$符号,因此使用!代替)
    $* 将所有参数作为一个对象
    $@ 将所有参数使用空格分隔的多个对象(因此若一个参数包括空格,应该使用引号)
    shift 移位,将$1->$0, $2->$1 ......

    注意:$? 表示最后语句的退出状态,$$表示进程自身的PID,$!表示SHELL最后运行的进程的pid

    $()的作用与``相同、${}用于有效地将变量的名称分隔开来

    while [ -n "$1" ]
    do
        case $1 in
        "-a") echo "Found the -a option";;
        "-b") echo "Found the -b option";;
        "-c") echo "Found the -c option";;
       "*")  echo "$1 is not an option";;
        esac
        shift    
    done
    
    count=1
    cat test1.sh | while read line
    do
        echo "Line $count: $line"
        count=$[ $count+1 ]
    done

    #使用read命令读取文件,
    cat test1.sh | while read line 表示将test1.sh依次读取,读取的行保存在line变量之中
    
    

    二、输入输出

    0    STDIN      标准输入
    1    STDOUT     标准输出
    2    STDERR     标准错误
    command 2>err.log 1>nor.log #重定向标准错误与标准输出
    echo "This is an error" >&2 #临时重定向到标准错误
    exec 1>nor.log  #永久重定向
    exec 0<test1.sh
    count=1
    
    while read line
    do
        echo "Line #$count: $line"
        count=$[$count+1]
    done
    
    #重定向标准输入的例子

    可以创建自己的文件描述符:

    exec 3>test.log 
    echo "Test" >&3

    重定向文件描述符:

    exec 3>&1
    exec 1>nor.log
    
    echo "This should store in the output file"
    echo "along with this line"
    
    exec 1>&3
    
    echo "Now things should be back to normal"

    exec 3>test.log
    .....
    exec 3>&- #关闭描述符
    #在其中先保存3为标准输出,然后重定向标准输出到文件,完成输出后,在把标准输出恢复

    列举文件描述符

    /usr/sbin/lsof -p pid

    禁止命令输出

    ls -al > /dev/null

    三、临时文件

    mktemp zcs.XXXX #按照指定格式在本地目录创建临时文件
    mktemp -t zcs.XXX #按照指定格式在系统临时目录创建临时文件
    mktemp -d #用于创建临时目录

    四、使用tee命令分流

    date | tee tee.log

    函数的使用

    1、函数定义

    复制代码
    function name {
    commands
    }
    
    name() {
    commands
    }
    复制代码

    #注意,name与大括号之间需要有空格

    函数只有在定义之后才能使用,因此在脚本的前面引用后面定义的函数将报错,另外同名函数将被替换。

    2、函数返回值

    1)默认返回值:最后一条命令的退出状态。执行完函数后马上使用 $? 来提取返回值。

    2)使用return语句 

      注意:这两种方式返回值取值范围都是 0~255,若为其他值将被取摸,因此有很大限制

    3)使用函数输出,如下:

      result=`function`

    也就是在函数中使用echo语句进行输出,将输出结果赋值给变量,此时可以输出任何类型的值,但是注意,所有的echo都将被赋值给变量。若要打印日志则要注意使用重定向到日志文件之中。

    exec 3>>func.log   #打开描述符3重定向添加到func.log文件之中
    ......
    echo "hah,lala">&3 #将日志打印到文件之中
    复制代码
    function arraydblr {
          local oriarray
          local newarray
          local elements
          local i
          oriarray=(`echo $@`)
          newarray=(`echo $@`)
          elements=$[$#-1]
          echo `date` "ori: ${oriarray[*]},new: ${newarray[*]},elements: $elements" >&3
          for (( i = 0; i <= $elements; i++ ))
          {   
              newarray[$i]=$[${oriarray[$i]} * 2]
          }
          echo `date` ${newarray[*]}>&3
          echo ${newarray[*]}
    }
    复制代码

    4)函数中使用参数

      向函数传递的参数可以通过 $0 … 类似脚本参数方式读取

      注意:对于脚本的参数,在函数内部无法访问,因此若需要应将其作为函数参数传递。

    5)全局变量与局部变量

      默认情况下,脚本中定义的所有变量都是全局变量,也就是在任何地方都可以访问

      可以在脚本的头部引用脚本末尾定义的全局变量值

      而函数为了避免污染全局变量,可以在函数内部使用local关键字定义变量。

    6)数组变量

    向函数传递数组,(注意:直接给函数传递数组变量,只会传递数组第一个值)

    方法:将数组拆分后传递给函数,在函数内部在组装成数组 

    func ${arr[*]}
        
    func {
        local arr;
        arr=(`echo “$@“`)
    }

    若要从函数中返回数组,只能通过echo的方式,echo ${ayyry[*]},外面使用变量赋值

    7)创建库文件

    将函数定义放到单独的文件之中,然后在使用的地方 通过source或者点命令导入库文件即可。

    还可以将函数定义到 .bashrc, 或者在其中引用库文件,这样所有新shell都引用了

     
     
     
  • 相关阅读:
    js封装一个哈希表
    js封装一个双链表
    js封装一个单链表
    js封装一个栈
    js封装一个优先级队列
    js封装一个队列
    微信小程序开发中自定义自适应头部导航栏
    Git的基本使用
    6位半数字万用表解释
    内存相关概念详解
  • 原文地址:https://www.cnblogs.com/chang290/p/3530169.html
Copyright © 2020-2023  润新知