Linux echo${1+;$}是什么意思

Linux echo${1+;$}是什么意思,linux,shell,erlang,Linux,Shell,Erlang,从/usr/local/bin/erl ROOTDIR=/usr/local/lib/erlang BINDIR=$ROOTDIR/erts-5.9.1/bin EMU=beam PROGNAME=`echo $0 | sed 's/.*\///'` export EMU export ROOTDIR export BINDIR export PROGNAME exec $BINDIR/erlexec ${1+"$@"} 我知道“$@”意味着争论。但是{1+“$@”}意味着什么?来自IEEE标

从/usr/local/bin/erl

ROOTDIR=/usr/local/lib/erlang
BINDIR=$ROOTDIR/erts-5.9.1/bin
EMU=beam
PROGNAME=`echo $0 | sed 's/.*\///'`
export EMU
export ROOTDIR
export BINDIR
export PROGNAME
exec $BINDIR/erlexec ${1+"$@"}
我知道“$@”意味着争论。但是{1+“$@”}意味着什么?

来自IEEE标准1003.1(POSIX 2013),:

使用替代值。如果参数未设置或为空,则应替换为空;否则,应替换单词的扩展(如果省略单词,则为空字符串)

即,
${1+“$@”}
展开为
“$@”
的值,命令行参数,除非未设置
$1
,即没有命令行参数,在这种情况下,表达式展开为零。下面是一个简单的脚本,它演示了如何工作

echo '"' ${1+"$@"} '"'
如果将其存储在文件
test.sh
中并运行它,则会得到:

/tmp$ sh test.sh
" "
/tmp$ sh test.sh 1
" 1 "
/tmp$ sh test.sh 1 2
" 1 2 "

(开头和结尾的空格来自
echo

拉斯曼对语义进行了解释,但没有阐明为什么
${1+“$@}
不同于简单的
“${}”
。在行为正常的shell中,${@}扩展为零。也就是说:
foo“$@”
如果“$@”为空,则应调用不带参数的
foo
。在行为不正确的shell中,
foo“$@”
将使用一个参数(空字符串)调用。许多历史shell将“$@”扩展为空字符串,而不是空字符串,但是
${1+“$@”}
正确地扩展为空字符串。

看,这是一个时代错误。您可以(也应该)只使用
“$@”
。。此外,不引用
$BINDIR
是一个错误,不引用
$0
,使用sed而不是参数扩展是愚蠢的。不要将此视为要模拟的代码。这与
echo'$@'
有何不同?Magnus,非常不同--
“$@”
使用原始的分词,而不带引号的
$@
的行为类似于
$*
;在
“$@”
中,双引号是语法性的,而在您的示例中它们是数据。啊,那么,我想问的是,
${1+“$@”}
“$@”
有什么不同?William Pursell似乎已经回答了这个问题。${parameter:+[word]}和${1+“$@”},为什么前者中的“:”没有出现在后者中?…很明显,这是POSIX不符合历史的shell;在今天的现代外壳中,没有必要担心这个bug。事实上,这似乎是一个错误。
/tmp$ sh test.sh
" "
/tmp$ sh test.sh 1
" 1 "
/tmp$ sh test.sh 1 2
" 1 2 "