位置引数リストを複数回解析するために$ @と$#をリセットできますか?

位置引数リストを複数回解析するために$ @と$#をリセットできますか?

いくつかのパラメータを解析する一般的なスクリプト()がありますcommon.sh。他のスクリプトはimport itを使用しますsource common.sh。パラメータの解析に以下のコードを複数回使用できるように$@合計をリセットする方法はありますか?$#

パラメータ解析が実行された後に使用できるように、最初に元のスクリプトパラメータを保存します。

readonly script_args=("${@}")

ただし、これは引数のみを保存するため、パラメータshift 分析を実行するために複数回使用することはできません。

パラメータ分析:

while [[ $# -gt 0 ]]; do
    case "$1" in
    --command=*)
        command="${1#*=}"
        ;;
    --project=*)
        project="${1#*=}"
        ;;
    --workspace=*)
        workspace="${1#*=}"
        ;;
    --account=*)
        account="${1#*=}"
        ;;
    --debug)
        debug="true"
        ;;
    "")
        log_debug "Empty argument"
        ;;
    *)
        log_error "Invalid argument: ${1}"
        exit 1
        ;;
    esac
    shift
done

答え1

Bourneなどのシェルでは、シェルオプションの設定に加えて、set位置パラメータの設定にも使用できます。

set -- "${script_args[@]}"

--必要:

  1. $script_args最初の要素がorで始まる場合は、オプションと見なされないようにオプションの終わりが表示されます。-+
  2. この問題を解決するために引数がに渡されない場合は、set位置引数を空のリストに設定する代わりに、変数(および一部のシェルの関数)のリストを印刷します。

"${script_args[@]}"、どちら〜しなければならない参照されるのは、"$@"Bourne シェルの拡張を配列のすべての要素に拡張する Korn シェル構文です。この構文もサポートしていzshます。bashyash

これらすべてから、yashあなたも使用することができます

set - "${script_args[@]}"

zshでは、次のものも使用できます。

argv=( "$script_args[@]" )

では、yash以下を使用することもできます。

set -- "$script_args"

等価物rcまたは派生物は次のとおりです。

* = $script_args

存在するfish

set argv $script_args

in csh/ tcsh(1970年代後半の配列をサポートする最初のシェル)

set argv = ($script_args:q)

¹Bourneシェルは--1981年にSysIIIまでこの機能をサポートしていませんでしたが、常にサポートされました-。これは実際にはオプションの区切り文字ではなく、オプションが最初の引数(forなど)shだけを考慮するだけです。これは空の-オプションのリストです。 。

関連情報