Shift:有全球版本吗?

Shift:有全球版本吗?

为了解析参数列表,我尝试实现一个常见的自顶向下解析方案。

我想知道为什么我的eat()功能不起作用。因为位置参数 $1、$2、$3、... 位于该特定函数的上下文中。不是实际脚本的内容。真糟糕。我还没习惯 bash。

所以我的问题是,如果它是正确的,那么移位的范围也是我的eat()函数的上下文,是吗?

真的没有办法从另一个函数内部转移脚本参数吗? :(

[这意味着我必须在 case 语句中实现所有逻辑(通常遵循自上而下的解析器)! (!?)]

答案1

函数可以返回它所传递的参数的全部(或子集)(例如通过全局数组),然后调用脚本可以使用它来设置自己的参数。例如

#!/bin/bash

declare -a args

nofoo() {
  # we don't like "--foo", it is forbidden!
  for a in "$@"; do
    [ "$a" != "--foo" ] && args+=("$a")
  done
}

nofoo "$@"
set -- "${args[@]}"

来自help setbash:

放:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

设置或取消设置 shell 选项和位置参数的值。

更改 shell 属性和位置参数的值,或显示 shell 变量的名称和值。

[...]

-- 将任何剩余的参数分配给位置参数。如果没有剩余参数,则取消设置位置参数。

相关内容