CentOS下Shell脚本参数传递,centosshellgetopts的ba
CentOS下Shell脚本参数传递,centosshellgetopts的ba
1. shell脚本的默认变量
下面用一个shell脚本来描述shell脚本的默认变量[ouyangyewei@localhost workspace]$ cat learn_argument.sh#! /bin/bash## check arguments##-----------------if [ $# -lt 3 ]thenecho "Error! Not Enough Arguments."echo "$0 $@"exit 1fi#-----------------func() {return 1;}funcecho '"$?" : ' "$?" # result from funcecho '"$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
评论暂时关闭