> shell编程 >

CentOS下Shell脚本参数传递

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

 

(责任编辑:IT)