> 数组
NAMES=(max helen sam zach)
NAMES[*] 取出所有数据,然后作为一个元素返回
NAMES[@] 取出所有数据,但是返回的仍然是一个数组,可以用来完成数组的赋值
> export
使父进程的变量对子进程可见、可用;一旦利用expert生命一个变量作为参数,shell就会把变量的值传递到子进程得到调用环境中,使用的是传值调用 每个子进程在使用变量时得到变量的副本。
eg. export cheese=american
或 cheese=american
export cheese
> typeset
函数内,局部变量用typeset修饰,避免重名
------------------------------------------------常用到的特殊参数-----------------------------------------------
> $$
当前运行的进程的PID
> $!
$!保存了后台运行的进程的PID
> $?
进程的退出状态,或者叫命令运行的返回状态码,可以通过检测$?,判断运行的结果
> $#
命令行上,除了命令之外的参数的个数
> $0
执行程序的命令的名称
> $1~$n
命令行参数
> $*
命令行参数的列表,包含了所有的命令行参数。$* 是一个参数,即:所有的命令行参数作为一个元素,整体地被输出。
> $@
类似于$* , 也返回命令忙参数的列表,不同的是,$@返回的是一个列表,一组元素,命令行参数作为一个列表返回,每个命令行参数是独立的。
注意:$*与$@在加" "的条件下,才显示出不同来
---------------------------------------------------------------------------------------------------------------------
> set
初始化命令行参数变量。set将set后面跟的一个或几个参数赋值给位置参数。
> read
内置命令,读入用户输入,将内容存储到用户指定的变量中。eg. read filename
如果不想指定一个变量保存read的输入内容,可以这样:read –p “Input:”。然后read 到的内容保存到了$REPLY变量中,echo "$REPLY" 可以查看读到的内容。其中,选项“-p ”来显示用户的提示。“Input:”只是一个输入提示,可以为“”,但是不能没有。
read –p “prompt” 后面可以跟一个变量,存取读到的内容,也可以不加变量,读到的值通过$REPLY获得。
也可以跟多个变量,read输入的时候,用空格隔开。
如果输入的变量个数少于脚本指定的个数,未赋值的变量为空:
如果输入变量个数多余脚本指定的个数,多出来的输入值都作为最后一变量的内容:
> 使用read读取文件
注意:是在while语句的末尾,也就是done后面,使用重定向“<”,将待扫描的文件名作为输入。
> exec
主要两个目的:1、在不用创建一个新进程来执行一个命令;2、重定向来自shell脚本内部的文件描述符
>/dev/tty
表示用户的工作屏幕。
发往/dev/tty设备的信息不会被转移(不会重定向来自脚本的标准输出和错误输出)。即使使用了标准输出重定向,发往/dev/tty的数据也会照常显示。
> trap
捕捉在脚本运行的时候发生的信号,便于用户在接收到信号后即使采取措施。
格式:trap ['commads'] [signal]
当捕捉到信号signal后,执行命令commands。如果要屏蔽某些信号,commands为空' '。
常用信号6个:1(挂起),2(中断Ctrl+C),3(退出),9(结束),15(软件中断),20(停止Ctrl+Z)
屏蔽多个信号时,空格隔开即可。eg. trap ' ' 1 2 3 15
trap可以用来在脚本运行中捕捉信号,也可以用来在运行结束后,做一些清理工作。eg.
> getopts
借助这个工具,可以实现给自己写的脚本配置选项。
我觉得,getopts就是一个在shell里被调用的一个工具,专门用来处理$1~$n,省去人手动地对$*的解析,将$1~$n输入给getopts,他就可以按照 选项、参数 把$0~$n解析出来,后面,直接使用getopts输出的结果就可以了。
看下面的例子:
getopts的使用格式: getopts optstring varname
如例子中的,getopts 处理的选项串为 :bt:uw: ,以“:”开头,表示由脚本负责产生错误信息,也就是屏蔽了getopts的错误输出
t和w后面加“:”表示这两个选项需要输入参数。
getopts按照类似循环的方式,处理选项串,用到了两个特殊的变量OPTIND(选项索引),OPTARG(选项参数)。OPTIND从1开始,getopts每发现一个参数,OPTIND就加1 .
由上图,可见,getopts读取了$0~$n的全部:因为-b 的OPTIND 为2 。
当getopts发现一个非法的选项时,将varname置为?,并发OPTARG设为选项字母;
当getopts发现一个选项缺少参数,将varname置为:,并把OPTARG设为缺少参数的选项。
如果忽略optstring开头的:,则不管是非法选项还是丢失参数,都会使varname为?:,如果OPTARG变量没有设置,getopts就会把自己的诊断信息写到标准输出。