如何在 Bash 脚本中仅识别 getopt 的完整选项

如何在 Bash 脚本中仅识别 getopt 的完整选项

我正在编写一个 Bash 脚本来解析命令行选项,然后执行所需的功能。

#!/bin/bash

TEMP=`getopt --longoptions help --options h --name 'script.sh' -- "$@"`

if [ $? != 0 ] ; then
  echo "Try 'script.sh --help' for more information." >&2 ;
  exit 1 ;
fi

eval set -- "$TEMP"

while true ; do
  case "$1" in
    -h|--help)
      echo "Usage:";
      exit 0;;
    --)
      shift ;
      break ;;
    *)
      echo "Internal error!" ;
      exit 1 ;;
  esac
done

echo "Remaining arguments:"
for arg do
  echo '--> '"'$arg'" ;
done

./script.sh --输出

Remaining arguments:

所有的

  • ./script.sh --h
  • ./script.sh --he
  • ./script.sh --hel
  • ./script.sh --help

输出

Usage:

./script.sh --helps输出

script.sh: unrecognized option '--helps'
Try 'script.sh --help' for more information.

如何防止截断的选项被识别为完整选项?我在 Bash 模式中找不到任何类似“字符串结尾”的内容。为什么没有--被检测为开头--help

答案1

人getopt

长选项可以缩写,只要缩写不产生歧义即可。

因此,只要缩写不会引起歧义,就会被缩写。您可以添加其他选项使其引起歧义:

TEMP=`getopt --longoptions help helpx --options h --name 'script.sh' -- "$@"`

会给你类似这样的信息:

./script.sh    --he
script.sh: option '--he' is ambiguous; possibilities: '--help' '--helpx'
Try 'script.sh --help' for more information.

答案2

您不应该以更通用的方式处理选项,而应该关心您感兴趣的选项:

for i in "$@"; do
    case "$i" in
        -h|--help)
            echo "usage"
            exit 0
            ;;
        --one|--two|--tree)
            continue
            ;;
        *)
            echo "error"
            exit 1
            ;;
    esac
done

相关内容