ken*_*orb 5 syntax bash shell arguments getopts
我有以下简单的代码:
#!/usr/bin/env bash
while getopts :f arg; do
case $arg in
f) echo Option $arg specified. ;;
*) echo Unknown option: $OPTARG. ;;
esac
done
Run Code Online (Sandbox Code Playgroud)
它适用于简单的场景,例如:
$ ./test.sh -f
Option f specified.
$ ./test.sh -a -f
Unknown option: a.
Option f specified.
Run Code Online (Sandbox Code Playgroud)
但是它不适用于以下情况:
$ ./test.sh foo -f
$ ./test.sh -a abc -f
Unknown option: a.
Run Code Online (Sandbox Code Playgroud)
如何修复上述代码示例以支持无效参数?
getopts
一旦找到一些未知的非选项参数(abc
),它似乎只是退出循环。
我通过将getopts
循环包装到另一个循环中找到了以下解决方法:
#!/usr/bin/env bash
while :; do
while getopts :f arg; do
case $arg in
f)
echo Option $arg specified.
;;
*)
echo Unknown option: $OPTARG.
;;
esac
done
((OPTIND++))
[ $OPTIND -gt $# ] && break
done
Run Code Online (Sandbox Code Playgroud)
然后跳过无效参数并在达到最大参数时中断循环。
输出:
$ ./test.sh abc -f
Option f specified.
$ ./test.sh -a abc -f
Unknown option: a.
Option f specified.
Run Code Online (Sandbox Code Playgroud)