关于unix:我无法理解$ {@}在KSH中的含义

I am having trouble understanding what ${@} means in KSH

问题不长,这是什么意思?

1
LogMsg"File:${@}"

logmsg()是用时间戳记录消息的方法。

但是他妈的做了什么

1
${@}

意思是?我还应该提到脚本还有1美元和2美元。谷歌没有结果。


字面上的:

1
2
3
f() { printf '%s
'"File: $@"; }
f"First Argument""Second Argument""Third Argument"

将扩展到并运行命令:

1
2
printf '%s
'"File: First Argument""Second Argument""Third Argument"

这就是说:它扩展了您的论点列表($1$2$3等),同时保持后续论点之间的分离(不以引用的方式丢弃用户提供的任何信息)。

这不同于:

1
2
printf '%s
' File: $@

1
2
printf '%s
' File: $*

两者相同:

1
2
printf '%s
'"File:""First""Argument""Second""Argument""Third""Argument"

…这两个字符串拆分和glob都扩展了参数列表,所以如果用户通过了,比如说,"*"(内部引号使其变为文字),这里的未加引号的用法将用扩展为glob的结果替换该字符,即当前目录中的文件列表。此外,字符串拆分还有其他副作用,如将换行符或制表符更改为空格。

它也不同于:

1
2
printf '%s
'"File: $*"

同:

1
2
printf '%s
'"File: First Argument Second Argument Third Argument"

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


KSH中,有两个位置参数*@

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

另一方面,"$@"等于"$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"。