【问题标题】:what does echo ${1+"$@"} meanecho ${1+"$@"} 是什么意思
【发布时间】:2013-10-16 22:48:00
【问题描述】:

来自 /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+"$@"} 是什么意思?

【问题讨论】:

  • 这是一个时代错误。您可以(并且应该)改用"$@"
  • ...另外,不引用$BINDIR 是一个错误,不引用$0 也是一个错误,并且使用sed 代替参数扩展是非常愚蠢的。不要将此视为要模拟的代码。

标签: linux shell erlang


【解决方案1】:

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

${parameter:+[word]}

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

即,${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。)

【讨论】:

  • 这和echo '"' $@ '"'有什么不同?
  • Magnus,完全不同——"$@" 使用原始分词,而未引用的$@ 的行为类似于$*;在"$@" 中,双引号是句法,而在您的示例中它们是数据。
  • 啊,那么,我想我想问的是,${1+"$@"}"$@" 有什么不同? William Pursell 似乎已经回答了这个问题。
  • ${parameter:+[word]}和${1+"$@"},为什么前者的“:”没有出现在后者?
【解决方案2】:

larsmans 提供了语义解释,但没有说明为什么${1+"$@"} 与简单的"${@}" 不同。在行为正常的 shell 中,"${@}" 扩展为空。那就是:foo "$@" 应该调用 foo,如果 "$@" 为空,则不带参数。在行为不正确的 shell 中,foo "$@" 将使用一个参数(空字符串)调用。许多历史上的 shell 将 "$@" 扩展为空字符串而不是空字符串,但 ${1+"$@"} 正确地扩展为空字符串。

【讨论】:

猜你喜欢
  • 2019-12-25
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2013-03-24
  • 2018-11-29
相关资源
最近更新 更多