"$@"
次のように、引数全体に対して文字列操作()を実行する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>
読むlocal
Ubuntu Wikiの「Dash as /bin/sh」ページセクションlocal args="$@"
、Dashは次のように製品ラインを拡張しているようです。
local args=foo bar baz
したがって、「foo」を入れてandargs
を(ローカル?)変数として宣言するだけです。実際にパラメータを追加して実行すると、変数を追加していることが確認されるようです。bar
baz
echo "bar: $bar"
my_func
=
$ foo.sh foo bar=baz
args: <foo>
bar: baz
それでは、$args
DashでBashと同様の動作(「foo bar baz」を含む)を取得する方法はありますか?
答え1
$@
拡張local args="$@"
はい指定されていないPOSIX標準パス。シェルは、bash
変数の値としてすべての位置引数を含むスペースで区切られた文字列を生成し、同時に実行args
などをdash
試みます。local args="$1" "$2" "$3"
シェルは少なくとも基本設定で同様に機能します(最初の文字は区切り文字として使用されますが、位置引数から単一の文字列を生成します)zsh
。ksh
bash
zsh
$IFS
yash
dash
あなたの場合は使用する必要があります
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/sh
local
sh