1

我想要一个 shell 脚本,它将文件名作为第一个位置参数,后跟选项(./test.sh <file> [options])。但是,当我在选项之前给出位置参数时,getopts 不起作用。我有以下代码:

while getopts "h" opt; do
  case $opt in
    h) 
      echo usage
      ;;
      ;;
  esac
done

echo $1

./test.sh -h在外壳上打印usage,但在外壳上./test.sh test -h打印test。因此,当我在选项之前给出位置参数时,它不会对该选项做任何事情。在选项后面有位置参数时它确实有效(更改echo $1echo $BASH_ARGV和调用./test.sh -h test)。我怎样才能在选项之前有位置参数?

4

2 回答 2

1

shell 内置 getopts 不支持重新排序参数。如果您想要参数重新排序,您需要使用增强的 getopt 变体之一(例如 gnu getopt 或 bsd getopt)。请注意,默认的 bsd getopt 不支持长选项(例如在 Mac OS X 上使用时)

于 2012-06-14T13:20:51.190 回答
1

尝试将“h”替换为h

while getopts h opt; do...

而且您还必须在您的情况下添加减号

case "$opt" in
 -h)...

如果您知道,您的 [file] 将始终存在,您可以使用

filename="$1"
shift

而不是解析其他参数

于 2012-06-14T10:26:57.560 回答