"$@"
我有一个 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
,至少在它们的默认配置中是这样。在您的情况下,您应该使用
或者
我在
$*
这里使用是为了清楚地表明我正在从值列表构造单个字符串。$IFS
该字符串将包含位置参数的值,由(默认为空格)的第一个字符分隔。我还
printf
用来确保获得用户提供的值的正确输出(请参阅为什么 printf 比 echo 更好?)。此外,您的脚本应该
#!/bin/dash
用作第一行,而不是#!/bin/sh
作为标准语法local
的扩展。sh