我希望有一个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
)时,它确实有效。如何在选项之前获得位置参数?
答案 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上使用时)