高级shell脚本编程之函数库、信号与陷进、文件处理、数组、安全性

来源:互联网 发布:centos svn服务器搭建 编辑:程序博客网 时间:2024/05/22 10:30

高级shell脚本编程之函数库、信号与陷进、文件处理、数组、安全性

1、函数库 把所有需要用到的函数都放到一个文件中,然后每个脚本的开头包含这个文件。例如:

#!/bin/shscope(){local soc=1gblsoc=2echo "local soc in func = $soc"echo "global gblsoc in func = $gblsoc"}another_scope_function(){echo "This is another_scope_func..."}yet_another_function(){echo "yet_another_function..........."}


可以通过如下方式访问所有这些函数:

#!/bin/bash. ./lib/scope       //点号(.):包含函数库文件scopeanother_scope_functionyet_another_functionexit 0

<1>getopts

getopts是shell内置的工具,用于检查传给命令行的选项是否有效。其语法如下:

getopts opstring name

getopts通过两个变量来跟踪所有事情:

OPTIND   保存下一个需要处理的参数索引

OPTARG   如果需要一个参数,getopts就把它放在这个变量中。

#!/bin/shwhile getopts "xy:z:" namedo echo "$name" $OPTIND $OPTARGdone


$ ./p213 -xy "one" -z "two"

getopts(1)、检查所有的命令行参数,查找以字符"-"开始的参数。

              (2)、当找到以字符"-"开始的参数,将 "-"之后的字符串和option-string比较。

        (3)、如果找到符合的匹配,则指定的变量被设置,否则,此变量被设成?字符。

        (4)、重复1到3,直到所有的选项被处理。

 

2、信号与陷阱trap
 在Shell程序运行的时候,可能收到各种信号,有的来自于操作系统,有的来自于键盘,而该Shell在收到信号后就立刻终止运行。但是在有些时候,你可能并不希望在信号到达时,程序就立刻停止运行并退出。而是他能希望忽略这个信号而一直在运行,或者在退出前作一些清除操作。trap命令就允许你控制你的程序在收到信号以后的行为。
    其格式如下:
     trap 'command; command' signal-number
    trap 'command; command' signal-name
    trap signal-number  
    trap signal-name

    后面的两种形式主要用于信号复位,即恢复处理该信号的缺省行为。还需要说明的是,如果trap后面的命令是使用单引号括起来的,那么该命令只有在捕获到指定信号时才被执行。如果是双引号,则是在trap设置时就可以执行变量和命令替换了。
    下面是系统给出的信号数字和信号名称的对照表:
    1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL 5)SIGTRAP 6)SIGABRT 7)SIGBUS 8)SIGFPE
    9)SIGKILL 10) SIGUSR1 11)SIGEGV 12)SIGUSR2 13)SIGPIPE 14)SIGALRM 15)SIGTERM 17)SIGCHLD
    18)SIGCONT 19)SIGSTOP ... ...

 

3、文件处理

<1>、文件检测

[option file]

表达式

-d file 如果file存在并且是一个目录

-e file  如果file存在

-r file  如果file存在并且可读

-s file  如果file存在并且大小大于0

-w file 如果file存在并且可写

-x file 如果file存在并且可执行

<2>、清除文件 收回各种信息

用trap命令清除临时文件
#!/bin/shtmpFile=/tmp/sigtrap$$cat > $tmpFilefunction removeTemp(){   if [-f "$tmpFile"]   then      echo "Strong out the temp file"      rm -f "$tmpFile"   fi  }trap removeTemp 1 2exit 0

 

4、数组

<1>声明数组三种方法

array1[index] = value

array2=(value1 value2 value3 value4)

array3=([0]=value1 [13]=value2 [7]=value3)

<2>解引用数组

获得数组中某个特定索引位置的数据,如下:

${array[index]}

value=${array3[13]}

echo "$value"

使用特定的符号来判断一个数组中所有的数据

arrayelements=${array2[@]}

arraylength=${#array2[@]}

也许不想返回所有的元素,而只需要其中某个返回内的数据

${array[@]:3}      //第一行从第四个元素开始返回所有余下元素中的数据

${array[@]:3:2}     //返回第四个元素之后的两个元素的值

${!array[@]}     //获得数组中包含的索引值

安全性:受限shell

#!/bin/sh
cd /usr/include
echo "'pwd'"
set -r
cd
echo "'pwd'"
set +r
exit 0

 

补充:

1.特殊参数$*和$@:这两个允许一次访问所有的命令行参数。除非使用双引号“”将它们括起,总结如下:

  $*:指定了所有的命令行参数。

  $@:也指定了所有的命令行参数。

  "$*":将整个参数列表作为一个参数来获取。

  "$@":获取整个参数列表,并将它分隔成不同的参数。

2.双引号", 单引号',反引号`三者的区别

  单引号':由单引号括起来的字符都作为普通字符出现,特殊字符用单引号括起来以后,也会失去原有意义,而只作为

  普通字符解释。

  双引号":由双引号括起来的字符,除$、、’、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为

  普通字符对待。

  反引号`:作用同$,如$pwd和`pwd`两者效果是一样的。