shell脚本使用两个横杠接收外部参数的方法

首先,效果是这样的:

既可以处理短选项(-)又可以处理长选项(--)

[developer@hadoop-cluster-manager shell]$ ./demo.sh --help
sqoop程序开始运行: demo.sh
Usage: ./demo.sh [options]

Options:
--append, -a:   追加导入(默认为追加模式)
--overwrite, -o: 覆盖导入 

--method, -m:   single-单日导入
        interval-区间导入
        all-全表导入

--date, -d:    单日导入,某一日期数据(格式为yyyymmdd)

--startdate, -s: 区间导入,开始日期
--enddate, -e:  区间导入,结束日期

--help, -h     帮助

shell脚本接外部参数有一种很简单的办法,在脚本中使用$0,$1,$2...指代执行脚本时传入的第几个参数($0是脚本名)。

但是,这样做毕竟不够优雅,

另一种方法shell脚本内使用getopts命令,只可以接短选项(eg:-d,-s,-h),很方便,比较简单,可以自己去搜一搜。

但如果想要达成上面这种效果同时支持长选项和短选项(eg:--date,-d,--startdate,-s,--help,-h),

就只能使用getopt命令了:

# 定义命令执行选项
if ! ARGS=$(getopt -o aom:d:s:e:h --long append,overwrite,method:,date:,startdate:,enddate:,help -n "$0" -- "$@"); then
echo "Terminating..."
echo -e "Usage: ./$SCRIPT_NAME [options]\n"
echo -e "Options:\n --append, -a:   追加导入(默认为追加模式)\n --overwrite, -o: 覆盖导入 \n\n --method, -m:   single-单日导入\n          interval-区间导入\n          all-全表导入\n\n --date, -d:    单日导入,某一日期数据(格式为yyyymmdd)\n\n --startdate, -s: 区间导入,开始日期\n --enddate, -e:  区间导入,结束日期\n\n --help, -h     帮助"
exit 1
fi

# 将规范化后的命令行参数分配至位置参数($1,$2,...)
# The -- ensures that whatever options passed in as part of the script won't get interpreted as options for set, but as options for the command denoted by the $progname variable.
eval set -- "${ARGS}"

# 接受执行选项;赋值给变量
while true; do
case "$1" in
-a|--append)
 mode='append'
 shift
 ;;
-o|--overwrite)
 mode='overwrite'
 shift
 ;;
-m|--method)
 method=$2
 shift 2
 ;;
-d|--date)
 date=$2
 shift 2
 ;;
-s|--startdate)
 startdate=$2
 shift 2
 ;;
-e|--enddate)
 enddate=$2
 shift 2
 ;;
--)
 shift
 break
 ;;
-h|--help)
 echo -e "Usage: ./$SCRIPT_NAME [options]\n"
 echo -e "Options:\n --append, -a:   追加导入(默认为追加模式)\n --overwrite, -o: 覆盖导入 \n\n --method, -m:   single-单日导入\n          interval-区间导入\n          all-全表导入\n\n --date, -d:    单日导入,某一日期数据(格式为yyyymmdd)\n\n --startdate, -s: 区间导入,开始日期\n --enddate, -e:  区间导入,结束日期\n\n --help, -h     帮助"
 exit 0
 ;;
?)
 echo "missing options, pls check!"
 exit 1
 ;;
esac
done

关于shell脚本使用两个横杠接收外部参数的文章就介绍至此,更多相关shell脚本接收参数内容请搜索编程宝库以前的文章,希望大家多多支持编程宝库

每个人或多或少总会碰到要使用并且自己完成编写一个最基础的Bash脚本的情况。真实情况是,没有人会说“哇哦,我喜欢写这些脚本”。所以这也是为什么很少有人在写的时候专注在这些脚本上。我本身也不是一个B ...