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 變數的名稱和值。

[...]

-- 將任何剩餘的參數分配給位置參數。如果沒有剩餘參數,則取消設定位置參數。

相關內容