如何在shell脚本中的选项之前建立位置参数?

时间:2012-06-14 10:19:55

标签: shell unix arguments sh getopts

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

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

echo $1

./test.sh -h在shell上打印usage,但./test.sh test -h在shell上打印test。因此,当我在一个选项之前给出一个位置参数时,它没有对该选项做任何事情。在选项后面有位置参数(将echo $1更改为echo $BASH_ARGV并调用./test.sh -h test)时,它确实有效。如何在选项之前获得位置参数?

2 个答案:

答案 0 :(得分:1)

尝试将“h”替换为h

while getopts h opt; do...

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

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

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

filename="$1"
shift

而不是解析其他论点

答案 1 :(得分:1)

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