在shell脚本中,如何在选项之前有一个位置参数?

在shell脚本中,如何在选项之前有一个位置参数?,shell,unix,arguments,sh,getopts,Shell,Unix,Arguments,Sh,Getopts,我想要一个shell脚本,它以文件名作为第一个位置参数,后跟选项(/test.sh[options])。但是,当我在选项之前给出位置参数时,getopts不起作用。我有以下代码: while getopts "h" opt; do case $opt in h) echo usage ;; ;; esac done echo $1 /test.sh-h在外壳上打印用法,但/test.sh test-h在外壳上打印测试。因此,当我在一个选项

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

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

echo $1
/test.sh-h
在外壳上打印
用法
,但
/test.sh test-h
在外壳上打印
测试
。因此,当我在一个选项之前给出一个位置参数时,它对该选项没有任何作用。当在选项后面有位置参数时(将
echo$1
更改为
echo$BASH_ARGV
并调用
/test.sh-h test
),它确实起作用。如何将位置参数置于选项之前

尝试将“h”替换为h

在你的例子中,你还必须加上负数

case "$opt" in
 -h)...
如果您知道您的[文件]将始终存在,您可以使用

filename="$1"
shift

而不是解析其他参数

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

我的getopts使用方式与您的有什么区别?因为对于我做的小测试,它们的工作原理是一样的。@NiekdeKlein如果你知道“filename”参数将始终存在,并且将放在首位,你可以按照我的建议使用
shift
,而不是使用
getopts
,我指的是“h”到h和-h部分。filename参数并不总是存在。
filename="$1"
shift