echo $ {1 +“$ @”}是什么意思

时间:2013-10-09 14:05:51

标签: 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+"$@"}

我知道“$ @”meams论点。但是{1 +“$ @”}意味着什么?

2 个答案:

答案 0 :(得分:4)

来自IEEE Std 1003.1(POSIX 2013),Shell command language

${parameter:+[word]}
  

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

即,${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 :(得分:4)

larsmans提供了对语义的解释,但没有说明为什么${1+"$@"}与简单"${@}"不同。在一个正常运行的shell中,“$ {@}”扩展为空。即:foo "$@"如果“$ @”为空,则应该在没有参数的情况下调用foo。在行为不正常的shell中,将使用一个参数(空字符串)调用foo "$@"。许多历史shell将“$ @”扩展为空字符串而不是任何内容,但${1+"$@"}正确扩展为空。