1. shell脚本的默认变量下面用一个shell脚本来描述shell脚本的默认变量 [ouyangyewei@localhost workspace]$ cat learn_argument.sh #! /bin/bash # # check arguments # #----------------- if [ $# -lt 3 ] then echo "Error! Not Enough Arguments." echo "$0 $@" exit 1 fi #----------------- func() { return 1; } func echo '"$?" : ' "$?" # result from func echo '"$0" : ' "$0" echo '"$1" : ' "$1" echo '"$2" : ' "$2" echo '"$3" : ' "$3" echo '"$@" : ' "$@" echo '"$#" : ' "$#" echo '"$$" : ' "$$" echo '"$?" : ' "$?" # result from last one : "$$" 执行结果如下: [ouyangyewei@localhost workspace]$ sh learn_argument.sh ouyangyewei yihaodian 23 "$?" : 1 "$0" : learn_argument.sh "$1" : ouyangyewei "$2" : yihaodian "$3" : 23 "$@" : ouyangyewei yihaodian 23 "$#" : 3 "$$" : 3208 "$?" : 0 对照上面的脚本以及执行结果,可以比较好地理解如下shell脚本的默认变量: 1. $0 代表执行脚本的名字 2. $1、$2、$3 分别代表各个顺序的参数(第一个参数、第二个参数以及第三个参数) 3. $@ 代表$1、$2、$3之意,每个变量都是独立的(用双引号括起来) 4. $# 代表参数的个数 5. $$ 代表当前脚本的运行进程ID(PID) 6. $? 代表执行完上一个指令的执行结果(如上面脚本,仔细对比两个$?,前者的值来自执行func,后者的值来自执行echo '"$$" : ' "$$") 2. shell脚本命令行参数2.1. getopts简介getopts是shell内建命令,可用来解析命令行参数。getopts的bash语法如下: getopts optstring name [args] optstring optstring包含了需要识别的选项字符串 1. 若optstring是以冒号开头,意味着进入slient error模式(getopts本身的报错 ,譬如缺少参数或非法选项等的报错;slient模式下不打印报错信息,但却会将错误信息输出到OPTARG中;非slient模式下会向错误输出打印报错信息) 2. 若一个选项字符是以冒号结尾,说明这个字符代表的选项需要接收参数; 3. 若一个选项字符不以冒号结尾,说明这个字符代表的选项不接收参数; 选项与参数之间以空格分隔; OPTARG 代表当前选项的参数值 更详细的用法可以参考man getopts,下面将以一个案例讲述getopts的用法。 2.2. 案例分析
如下的shell脚本实现了上述邮件预警功能: [ouyangyewei@localhost workspace]$ cat email_alert.sh #! /bin/bash ############################################### # File: check_path # Description: 验证给定的路径, # 若存在,则返回1; # 否则返回0,并邮件告知 # # Usage: sh check_path \ # -p path_need_to_check \ # -f from@email \ # -t to@email \ # [-c cc@email \] # # author: ouyangyewei@yhd.com # date: 2015-10-26 ############################################### # # 检查入参 # #--------------------------------------------- if [ $# -lt 3 ] then echo "Error! Not Enough Params." echo "Usage : sh check_path -p path_need_to_check -f from@email -t to@email [-c cc@email]" exit 1; fi #--------------------------------------------- # # 定义变量 # #--------------------------------------------- path=0; # path need to check from=0; # email sender to=0; # email receiver cc=0; # email carbon copy #--------------------------------------------- #--------------------------------------------- # # 解析入参 # #--------------------------------------------- # optstring是"p:f:t:c:",字符串optstring没有以冒号开头, # 说明不进入slient error模式,如果getopts执行时有报错, # (譬如非法选项,错误参数等),会向错误输出打印错误信息。 # # 另外p,f,t,c都是选项,每个选项后面都有冒号, # 说明这四个选项都需要接收参数。 # # OPTARG记录当前选项的参数值。 # while getopts "p:f:t:c:" opt do case $opt in p) #set option "p" path=$OPTARG ;; f) #set option "f" from=$OPTARG ;; t) #set option "t" to=$OPTARG ;; c) #set option "c" cc=$OPTARG ;; *) echo "-$opt not recognized" ;; esac done echo "path : $path" echo "from : $from" echo "to : $to" echo "cc : $cc" 执行结果如下: [ouyangyewei@localhost workspace]$ sh email_alert.sh Error! Not Enough Params. Usage : sh check_path -p path_need_to_check -f from@email -t to@email [-c cc@email] [ouyangyewei@localhost workspace]$ sh email_alert.sh \ > -p /user/hive/warehouse/pms.db/pms_tp_config \ > -f alert@yhd.com.cn \ > -t ouyangyewei@foxmail.com path : /user/hive/warehouse/pms.db/pms_tp_config from : alert@yhd.com.cn to : ouyangyewei@foxmail.com cc : 0
其中,上面并没有指定cc参数,所以cc得到的是脚本里面指定的默认值0 |