Linux echo${1+;$}是什么意思
从/usr/local/bin/erlLinux 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标
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 "