我已经有一个仅接受短选项的脚本,并且我想扩展相同的脚本以传递相应的长选项。现有代码如下。
while getopts :t:c: name; do
case name
t) first=$OPTARG;;
c) second=$OPTARG;;
*) echo 'Invalid option'; break;;
esac
done
SHIFT $((OPTIND-1))
这适用于短选项,但如何扩展相同的代码以允许长选项解析?
答案1
鉴于可用的选项不一致,我倾向于自行推出;例如
SWITCH=false
VAL=default
while [ "$#" -gt 0 ] ; do
case "${1}" in
(-s|--switch) SWITCH=true ;;
(-v|--value) VAL="${2}" ; shift ;;
(-v?*) VAL="${1#-v}" ;;
(--value=?*) VAL="${1#--value=}" ;;
esac
shift
done
答案2
这很简单,但文档仅位于getopt()
Solaris 的手册页和getopts
以下文档中bosh
:
http://schilytools.sourceforge.net/man/man1/bosh.1.html
向下滚动至 2019 年 12 月版本的第 47 页。
让我编辑你的例子:
while getopts ":t:(test)c:(call)" name; do
case $name in
t) first=$OPTARG;;
c) second=$OPTARG;;
:) echo "Missing argument for -$OPTARG"; break;;
*) echo 'Invalid option'; break;;
esac
done
shift $((OPTIND-1))
请注意,您可能需要引用包含括号的参数......
这接受-c
和--call
。
请注意,这仅适用于
- bosh,任何操作系统上由 schilytools 维护的 POSIX 增强型 Bourne Shell
- sh ,Solaris 10 上的旧 Bourne Shell
- 任何操作系统上的 ksh93
bosh
此外,-long
如果optstring
以 . 开头,还支持 UNIX 风格的长选项()
。
两者ksh93
都bosh
支持以+
ifoptstring
开头的选项+
。在这种情况下,如果程序是用 调用的,则$name
包含+c
而不是。c
+c
BTW:仅bosh
支持一种支持没有相邻短选项的长选项的方法。请参阅bosh
手册页。
我是 schilytools 的作者。