將“$@”放在破折號中的局部變數中
"$@"
我有一個 Bash 函式,它通過將它放在一個局部變數中來對其參數作為一個整體 () 進行一些字元串操作,如下所示:#!/bin/sh my_func() { local args="$@" echo "args: <$args>" } my_func "$@"
當我在 Bash 中執行它時,
args
包含所有傳遞的參數:$ bash foo.sh foo bar baz foo bar baz
但是,如果我在 Dash 中執行它,則只儲存第一個參數:
$ dash test.sh foo bar baz args: <foo>
閱讀Ubuntu Wiki 的“Dash as /bin/sh”頁面中的部分
local
,似乎 Dash 正在local args="$@"
像這樣擴展該行:local args=foo bar baz
因此僅將“foo”放入並將
args
其聲明為(本地?)變數。事實上,如果我在參數中添加並執行它,似乎可以確認我正在添加變數:bar``baz``echo "bar: $bar"``my_func``=
$ foo.sh foo bar=baz args: <foo> bar: baz
說了這麼多,有沒有辦法
$args
在 Dash 中獲得類似 Bash 的行為(包含“foo bar baz”)?
POSIX 標準未指定
$@
in的擴展。shell將創建一個以空格分隔的字元串,其中包含所有位置參數作為變數的值,同時將嘗試執行(等)local args="$@"
bash``args``dash``local args="$1" "$2" "$3"
zsh
和shell的ksh
行為類似於bash
(從位置參數創建單個字元串,儘管zsh
將使用第一個字元$IFS
作為分隔符),而yash
shell 的行為類似於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