【问题标题】:What is the difference between $@ and $* in linux shell script? [duplicate]linux shell脚本中的$@和$*有什么区别? [复制]
【发布时间】:2018-01-23 04:16:20
【问题描述】:

在《Linux Shell Scripting Cookbook》一书中

它说$@ 扩展为$1$2$3 等等,$* 扩展为$1c$2c$3,其中cIFS 的第一个字符。

$@$* 有什么区别,IFS 是什么意思?

【问题讨论】:

  • 为什么这个问题被否决了?

标签: linux shell


【解决方案1】:

IFS 是内部字段分隔符,它基本上表示shell 识别为分隔单词的内容。

所以要运行以下命令

IFS=$'\n'

会导致 shell 将新行识别为分隔符。

$ 是某物被赋值给变量的标志

但是这些数字是为脚本输入保留的。

所以 $1 将是一个变量输入,$2 将是第二个变量输入。

$@ 是传递给脚本的所有参数。

所以如果你运行命令

bash command.sh bork woof meow

这将是上面列出的变量的值

  $1 = bork
  $2 = woof
  $3 = meow
  $@ = bork woof meow

【讨论】:

    【解决方案2】:

    手册中的解释很难改进。例如,dash(1) 说:

    $@

    从一开始扩展到位置参数。当扩展发生在双引号内时,每个位置参数都扩展为一个单独的参数。如果没有定位 参数,@ 的扩展生成零参数,即使 @ 被双引号引起来。这基本上意味着,例如,如果$1 是“abc”并且$2 是“def ghi”,那么"$@" 扩展为 两个参数:"abc""def ghi"

    我们可以通过一些例子来展示$*$@之间的区别:

    $ set 1 "2 3"
    $ printf '"%s"\n' "$@"
    "1"
    "2 3"
    $ printf '"%s"\n' $@
    "1"
    "2"
    "3"
    $ printf '"%s"\n' "$*"
    "1 2 3"
    $ printf '"%s"\n' $*
    "1"
    "2"
    "3"
    

    手册页还描述了IFS

    IFS

    输入字段分隔符。这通常设置为⟨space⟩、⟨tab⟩和⟨newline⟩。有关详细信息,请参阅空白分割部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 2011-05-15
      • 2015-04-07
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多