zoukankan      html  css  js  c++  java
  • 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都引用了

     
     
     
  • 相关阅读:
    unexpected inconsistency;run fsck manually esxi断电后虚拟机启动故障
    centos 安装mysql 5.7
    centos 7 卸载mysql
    centos7 在线安装mysql5.6,客户端远程连接mysql
    ubuntu 14.04配置ip和dns
    centos7 上搭建mqtt服务
    windows eclipse IDE打开当前类所在文件路径
    git 在非空文件夹clone新项目
    eclipse中java build path下 allow output folders for source folders 无法勾选,该如何解决 eclipse中java build path下 allow output folders for source folders 无法勾选,
    Eclipse Kepler中配置JadClipse
  • 原文地址:https://www.cnblogs.com/chang290/p/3530169.html
Copyright © 2011-2022 走看看