我不确定switch
是不是正确的术语,因为我是Unix
的新手。
我有一个shell脚本,该脚本要求我所说的switch
才能正常运行,但我也想传递参数:
./scriptname -cm
如果我只运行./scriptname
,它将失败。但我也想传递各种参数:
./scriptname -cm arg1 arg2 arg3 arg4
这似乎由于-cm
而失败。通常,当我执行./scriptname arg1 arg2 arg3
时,它将正常工作,但是一旦添加开关,它将失败。有建议吗?
Edit1:
添加一些更相关的代码:
./scriptname -cm
将致电
脚本名称
gencmlicense()
{
echo $2
do stuff
}
gentermlicense()
{
do stuff
}
if [ "$1" = "-cm" ] ; then
gencmlicense
elif [ "$1" = "-term" ] ; then
gentermlicense
fi
如果我添加了一个参数,则echo $2
将不会打印出传递的第二个参数。
答案 0 :(得分:3)
如果要将参数从主脚本传递给未修改的函数,请使用
...
if [ "$1" = "-cm" ] ; then
gencmlicense "$@"
elif [ "$1" = "-term" ] ; then
gentermlicense "$@"
fi
"$@"
(带双引号!)扩展为所有位置参数。有关更多信息,请参见您的shell手册,可能在“参数扩展”下。
如果您的函数不需要第一个位置参数,则可以将其移开:
if [ "$1" = "-cm" ]; then
shift
gencmlicense "$@"
elif [ "$1" = "-term" ]; then
shift
gentermlicense "$@"
fi
但是,处理选项的专业方法是内置getopts
,因为它既灵活又可扩展,但结构紧凑。这就是我用的:
#!/bin/sh
MYNAME=${0##*/} # Short program name for diagnostic messages.
VERSION='1.0'
PATH="$(/usr/bin/getconf PATH):/usr/local/bin"
usage () {
cat << EOF
usage: $MYNAME [-hvVx] [-a arg] ...
Perform nifty operations on objects specified by arguments.
Options:
-a arg do something with arg
-h display this help text and exit
-v verbose mode
-V display version and exit
-x debug mode with set -x
EOF
exit $1
}
parse_options () {
opt_verbose=false
while getopts :a:hvVx option; do
case $option in
(a) opt_a=$OPTARG;;
(h) usage 0;;
(v) opt_verbose=true;;
(V) echo "version $VERSION"; exit 0;;
(x) set -x;;
(?) usage 1;;
esac
done
}
#-------------------------------------------------------------#
# Main script #
#-------------------------------------------------------------#
parse_options "$@"
shift $((OPTIND - 1)) # Shift away options and option args.
...rest of script here...