Zsh - 使用点运算符时用空格分割字符串

Zsh - split string by spaces when using dot operator

这是我的脚本:

#/bin/bash
list="a b c"
for i in $list; do
  echo $i
done

这个有效:

➜  ~  ./lol.sh 
a
b
c

这不是:

➜  ~  . ./lol.sh 
a b c

为什么拆分不能与点命令一起使用,我该如何解决?

列表永远不应表示为字符串。使用数组语法。

list=( a b c )
for i in "${list[@]}"; do
  echo "$i"
done

这是首选的几个原因。

在 ZSH 中:

  • ZSH 打破了 POSIX,除非他们明确要求,否则根本不对未加引号的扩展执行字符串拆分。您可以通过 运行 setopt sh_word_split 或使用参数扩展 ${=list}${(ps: :)list}
  • 提出此请求

在其他 Bourne 派生的 shell 中:

  • 字符串拆分取决于 IFS 的值,不能保证默认值,尤其是 来自单独的脚本时(可能已在本地更改) .
  • 不加引号的扩展也会执行通配,这可能会根据当前工作目录中的文件而产生不同的结果(例如,如果您的列表包含 hello[world],如果您当前的目录包含名为 hellowhelloo 或以其他方式匹配 glob 的文件。
  • 避免通配步骤不仅更正确,而且效率更高。

虽然我注意到 Charles Duffy 关于列表的评论,但这是我的 solution/test。

#!/bin/zsh
function three()
{
        first=
        second=
        third=
        echo "1: $first 2: $second 3:$third"
}

setopt sh_word_split
set "1 A 2" "2 B 3" "3 C 4" "4 D 5"
for i;do
        three $i;

 done

这将输出

1: 1 2: A 3:2
1: 2 2: B 3:3
1: 3 2: C 3:4
1: 4 2: D 3:5