2

我想制作一个脚本,您可以在其中提供几个参数:

while getopts ":a:b:c:" opt; do
  case $opt in
    a)
      echo "-a was triggered
      ;;
    b)
      echo "-b was triggered
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

我现在拥有的代码可以工作,但我遇到的问题是,如果它结合起来,我想提供另一个功能/回声。

示例:当我这样做时: .MyScript -ab 它应该提供另一个函数,该函数在“a”或“b”中定义

有点像:

ab) -> Script -a -b or Script -ab 
 echo "-ab was triggered"

这样做的最佳解决方案是什么?任何想法,您可以自由发布!

4

2 回答 2

1
while getopts ":a:b:c:" opt; do
  case $opt in
    a)
      echo "-a was triggered"
      a_val=$OPTARG
      ;;
    b)
      echo "-b was triggered"
      b_val=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done
if [[ -n $a_val ]]; then do something with "$a_val"; fi
if [[ -n $b_val ]]; then do something with "$b_val"; fi

唯一可能引起混淆的情况是用户通过-a ""- 一种解决方法是:

a=false
b=false
while getopts ":a:b:c:" opt; do
  case $opt in
    a) echo "-a was triggered"; a_val=$OPTARG; a=true ;;
    b) echo "-b was triggered"; b_val=$OPTARG; b=true ;;
  esac
done
if $a; then do something with "$a_val"; fi
if $b; then do something with "$b_val"; fi

在这里,没有括号:if $a; then ...因为我正在调用命令“true”或“false”并对该退出状态进行操作。

于 2013-06-03T10:55:52.673 回答
1

更新

您可以使用getopt(1) linux 实用程序。这不是内部函数,但它可以处理长参数。

尝试这个:

declare -A OPTARG
GetOpt() {
  local prog="${BASH_SOURCE[0]}"
  [ $# -eq 0 ] && echo "$prog: Bad call of GetOpts">&2 && exit 1
  local longopt="$1"
  shift

  local tmp
  tmp=$(getopt -n"$prog" -a -l "$longopt" -- '' "$@") || exit
  eval "tmp=($tmp)"

  local i
  for((i=0;i<${#tmp[*]};++i)){
    key=${tmp[i]#--}
    [ -z "$key" ] && break
    if [[ "${tmp[i+1]}" =~ ^-- ]]; then OPTARG[$key]=1
    else OPTARG[$key]="${tmp[++i]}"
    fi
  }
  for((j=0;++i<${#tmp[*]};++j)){ OPTFILE[j]=${tmp[i]};}
}

GetOpt "a b ab file:" "$@"

[ "${OPTARG[a]}" -a "${OPTARG[b]}" ] && OPTARG[ab]=1 && unset OPTARG[a] OPTARG[b]

[ "${OPTARG[a]}" ] && echo Do a
[ "${OPTARG[b]}" ] && echo Do b
[ "${OPTARG[ab]}" ] && echo Do ab

定义的GetOpt函数会将已解析的命令行参数与选中的长选项一起放置到名为 的关联数组中OPTARG。如果有错误,它将无法通知问题。

使用getopt'-a选项,您可以使用-ab--ab格式化。请记住,如果您已del定义,则-d选项(如果-d未指定)将扩展为--del.

如果您指定带有附加选项的 arg,它可以包含空格。例如,如果-l file:定义在getoptthen 它可以用作./test --file="q w". ${OPTARG[file]}q w

OPTFILE数组包含可选参数(在 之后给出的参数--)。

于 2013-06-03T10:58:51.280 回答