将参数传递给具有开关的shell脚本

时间:2018-06-22 16:57:18

标签: linux shell

我不确定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将不会打印出传递的第二个参数。

1 个答案:

答案 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...