SHELL脚本进阶

1、读取参数shell

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

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

在使用参数以前应该尽可能测试参数 [ -n "$1" ] 因为须要将参数做为字符串所以添加引号函数

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

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

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

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变量之中
 

2、输入输出spa

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

重定向文件描述符:code

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

3、临时文件

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

4、使用tee命令分流

date | tee tee.log

 

 

函数的使用

 

一、函数定义

复制代码
function name {
commands
}

name() {
commands
}
复制代码

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

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

二、函数返回值

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都引用了

相关文章
相关标签/搜索