首页 > 解决方案 > 如何在 bash 命令行参数范围内进行搜索

问题描述

假设我有程序test.sh,它有参数,有些是可选的,有些没有。

例如:

./test.sh --foo /path/to/file --baz --bar1 --bar2 --bar3

其中foobaz以及路径是必需的,而bars 是可选参数。

现在,我希望能够使路径顺序之后的所有内容都变得不敏感。

可以使用

if [[ "$3" == "--baz" ]] || [[ "$4" == "--baz" ]] || ... || [[ "${(n-1)}" == "--baz" ]] || [[ "${n}" == "--baz" ]]

但这很慢而且很乱,即使对我来说也是如此。

理想情况下,我会有类似的东西:

if [[ ${n > 2} == "--baz" ]]; then

标签: bashshellparameters

解决方案


根据以下答案:

你可以想出以下答案:

[[ " ${@:3} " =~ " --baz " ]] && echo yes || echo no

如果你有类似的东西,这可能会失败

command --foo /path/to/file --flag1 option1 --flag2 "foo --baz bar" --flag3

哪里foo --baz bar可以选择--flag2

另一种更安全的方法是:

for arg in "${@:3}"; do
   [[ "${arg}" != "--baz" ]] && continue
   # perform action here if --baz is found
   set-of-commands
   # need this line for early return
   break
done

推荐阅读