ダッシュのローカル変数に「$@」を入れます。

ダッシュのローカル変数に「$@」を入れます。

"$@"次のように、引数全体に対して文字列操作()を実行するBash関数があります。

my_func() {
    local args="$@"
    echo "args: <$args>"
}

my_func "$@"

Bashで実行すると、argsすべての引数が渡されます。

$ bash foo.sh foo bar baz
args: <foo bar baz>

ただし、Dashで実行すると、最初の引数のみが保存されます。

$ dash test.sh foo bar baz
args: <foo>

読むlocalUbuntu Wikiの「Dash as /bin/sh」ページセクションlocal args="$@"、Dashは次のように製品ラインを拡張しているようです。

local args=foo bar baz

したがって、「foo」を入れてandargsを(ローカル?)変数として宣言するだけです。実際にパラメータを追加して実行すると、変数を追加していることが確認されるようです。barbazecho "bar: $bar"my_func=

$ foo.sh foo bar=baz
args: <foo>
bar: baz

それでは、$argsDashでBashと同様の動作(「foo bar baz」を含む)を取得する方法はありますか?

答え1

$@拡張local args="$@" はい指定されていないPOSIX標準パス。シェルは、bash変数の値としてすべての位置引数を含むスペースで区切られた文字列を生成し、同時に実行argsなどをdash試みます。local args="$1" "$2" "$3"

シェルは少なくとも基本設定で同様に機能します(最初の文字は区切り文字として使用されますが、位置引数から単一の文字列を生成します)zshkshbashzsh$IFSyashdash

あなたの場合は使用する必要があります

my_func () {
    local args
    args="$*"

    printf 'args: <%s>\n' "$args"
}

または

my_func () {
    local args="$*"

    printf 'args: <%s>\n' "$args"
}

$*ここでは、値リストで単一の文字列を構成していることを示すためにこれを使用しています。文字列には、最初の文字$IFS(デフォルトは空白)で区切られた位置パラメーターの値が含まれています。

printfまた、ユーザーが指定した値に対して正しい出力を取得するかどうかを確認するためにも使用されます(参照なぜprintfがechoより優れているのですか?)。

また、スクリプトは標準構文の拡張では#!/bin/dashなく、最初の行として使用する必要があります。#!/bin/shlocalsh

関連情報