【问题标题】:I am having trouble understanding what ${@} means in KSH我无法理解 ${@} 在 KSH 中的含义
【发布时间】:2014-10-17 16:47:37
【问题描述】:

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

LogMsg "File:${@}"

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

但到底是怎么回事

${@} 

是什么意思?我还应该提到脚本也有 $1 和 $2。谷歌没有产生任何结果。

【问题讨论】:

标签: unix ksh aix


【解决方案1】:

字面意思:

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(默认为空格)中来组合所有参数。

【讨论】:

    【解决方案2】:

    KSH 中有两个位置参数*@

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 喜欢传入脚本的整行内容吗?
      • @R4F6,是的 - 拆分为单独的参数(如果引用为 "$@"),而 $* 将它们组合在一起。使用不带引号的$@$* 相同,因此通常是一个错误。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2015-12-25
        • 2019-08-22
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 2021-05-08
        相关资源
        最近更新 更多