【发布时间】:2021-04-29 08:07:36
【问题描述】:
在请求一些参数 (arg) 和选项 (-a) 的脚本中,我想让脚本用户可以将选项放置在命令行中他想要的位置。
这是我的代码:
while getopts "a" opt; do
echo "$opt"
done
shift $((OPTIND-1))
echo "all_end : $*"
有了这个订单,我就有了预期的行为:
./test.sh -a arg
a
all_end : arg
我想用这个订单得到同样的结果:
./test.sh arg -a
all_end : arg -a
【问题讨论】:
-
大部分 linux 命令都支持这个特性。我不希望我的用户丢失。示例:
tail file -n 5和tail -n 5 file有效。 -
这和“tail 5 -n”不同,这是你想要的,这是不可能的
-
我认为您必须首先修改
$@中的位置参数并删除所有非选项参数。getopts本身无法支持您的要求。 -
大多数 linux 命令不是用 Bourne shell 编写的,而是使用类似 GNU
getops_long库调用选项处理(或完全不同的东西;大多数语言都有自己的标准——或多个——选项处理模块)。您当然可以在 shell 脚本中编写自己的选项处理例程来执行您想要的操作。 -
Complex option parsing 中描述了一种重新排列的解决方案。