我无法理解$ {@}在KSH中的含义

时间:2014-10-17 16:47:37

标签: unix ksh aix

这不是一个很长的问题,这是什么意思?

LogMsg "File:${@}"

LogMsg()是一种使用时间戳记录消息的方法。

但是他到底做了什么

${@} 

意思?我还应该提到脚本也有1美元和2美元。 Google没有产生任何结果。

4 个答案:

答案 0 :(得分:4)

字面上:

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"

...这些都是字符串拆分和全局扩展参数列表,所以如果用户已经通过了,例如,"*"(内部引号旨在使其成为文字),这里的非引用用法将替换为将其扩展为glob的结果的字符,即。当前目录中的文件列表。此外,字符串拆分还有其他副作用,例如将换行符或制表符更改为空格。


它也不同于:

printf '%s\n' "File: $*"

与:

相同
printf '%s\n' "File: First Argument Second Argument Third Argument"

...正如您在上面所看到的那样,通过将第一个字符放在它们之间的IFS(默认为空格)中来组合所有参数。

答案 1 :(得分:2)

<{1>} KSH中有两个位置参数*@

"$*"是一个单个字符串,由所有位置参数组成,由变量IFS(内部字段分隔符)中的第一个字符分隔,默认情况下为空格,TAB和换行符。

另一方面,"$@"等于"$1" "$2" … "$N ",其中N是位置参数的数量。

有关详细信息和示例:http://oreilly.com/catalog/korn2/chapter/ch04.html

答案 2 :(得分:1)

这是命令行的参数集。 如果通过cmd a b c d之类的命令启动脚本,则有5个参数,$0将是命令cmd$1是第一个参数a,{ {1}}第二个$2等等b将是除命令之外的所有参数。

答案 3 :(得分:0)

其他帖子没有解释的一件是使用{$@${@}相同,但如果需要,您可以添加字母等,但这些字母不会添加空格。你可以说${foo}dog,如果$ foo设置为little,结果将是littledog,没有空格。如果${@}dogdog$@设置为a b c d,则结果为“a”“b”“c”“ddogdog”。