了解 bash 或 zsh 中的 $@

了解 bash 或 zsh 中的 $@

myFun1myFun2下面的不会产生相同的输出。为什么?

#!/bin/bash

myFun1() {
  local item
  IFS=:
  for item in "${@}"; do
    echo "->${item}<-"
  done
}

myFun2() {
  local items="${@}";
  local item
  IFS=:
  for item in "${items}"; do
    echo "->${item}<-"
  done
}

调用

myFun1 "a=b" "c='d 1'" "e"

产生

->a=b<-
->c='d 1'<-
->e<-

然而

myFun2 "a=b" "c='d 1'" "e"

产生

->a=b c='d 1' e<-

答案1

这种行为是由 POSIX 定义,Bash 和 Zsh 都努力遵守这一点。

@
扩展到位置参数,从 1 开始。当扩展发生在双引号内并且执行字段拆分(请参阅字段拆分)时,每个位置参数应扩展为单独的字段,...

然而,这种行为仅适​​用于$@其自身。将其值分配给另一个变量会导致各个字段的含义丢失,然后将其视为单个字符串(就像您使用的一样$*)。

我不确定 Zsh,但如果在 Bash 中您想保存$@到另一个变量并能够利用字段分隔,则需要使用数组。

myFun2() {
  local -a items=("${@}");
  local item
  IFS=:
  for item in "${items[@]}"; do
    echo "->${item}<-"
  done
}

在 Bash 中,表单的数组扩展"${array[@]}""$@".

相关内容