【发布时间】:2014-10-17 16:47:37
【问题描述】:
不是一个很长的问题,这是什么意思?
LogMsg "File:${@}"
LogMsg() 是一种记录带有时间戳的消息的方法。
但到底是怎么回事
${@}
是什么意思?我还应该提到脚本也有 $1 和 $2。谷歌没有产生任何结果。
【问题讨论】:
不是一个很长的问题,这是什么意思?
LogMsg "File:${@}"
LogMsg() 是一种记录带有时间戳的消息的方法。
但到底是怎么回事
${@}
是什么意思?我还应该提到脚本也有 $1 和 $2。谷歌没有产生任何结果。
【问题讨论】:
字面意思:
f() { printf '%s\n' "File: $@"; }
f "First Argument" "Second Argument" "Third Argument"
将展开并运行命令:
printf '%s\n' "File: First Argument" "Second Argument" "Third Argument"
也就是说:它扩展了您的参数列表($1、$2、$3 等),同时保持后续参数之间的分隔(不会丢弃用户通过引用提供的任何信息)。
这不同于:
printf '%s\n' File: $@
或
printf '%s\n' File: $*
两者相同:
printf '%s\n' "File:" "First" "Argument" "Second" "Argument" "Third" "Argument"
...这两个字符串拆分和全局扩展参数列表,所以如果用户传递了,比如说,"*"(在引号内旨在使其成为文字),此处未加引号的使用会将该字符替换为将其扩展为全局的结果,即。当前目录中的文件列表。此外,字符串拆分还有其他副作用,例如将换行符或制表符更改为空格。
它也不同于:
printf '%s\n' "File: $*"
等同于:
printf '%s\n' "File: First Argument Second Argument Third Argument"
...正如您在上面看到的,它通过将第一个字符放在IFS(默认为空格)中来组合所有参数。
【讨论】:
在KSH 中有两个位置参数* 和@
"$*" 是由所有位置参数组成的单个字符串,由变量 IFS(内部字段分隔符)中的第一个字符分隔,默认情况下为空格、TAB 和换行符。
另一方面,"$@" 等于"$1" "$2" … "$N ",其中N 是位置参数的数量。
更多详细信息和示例:http://oreilly.com/catalog/korn2/chapter/ch04.html
【讨论】:
这是命令行的参数集。
如果您通过类似cmd a b c d 的命令启动脚本,则有5 个参数,$0 将是命令cmd、$1 第一个参数a、$2 第二个b 等。 ${@} 将是除命令之外的所有参数。
【讨论】:
"$@"),而 $* 将它们组合在一起。使用不带引号的$@ 与$* 相同,因此通常是一个错误。
其他帖子没有解释的一个是{的使用。 $@ 与 ${@} 相同,但允许您在需要时添加字母等,并且这些字母不会添加空格。例如你可以说${foo}dog,如果 $foo 设置为little,结果将是littledog,没有空格。在${@}dogdog 和$@ 设置为a b c d 的情况下,结果是“a”“b”“c”“ddogdog”。
【讨论】: