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