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

lst*_*kov 3 shell scripting split zsh

这是我的脚本:

#/bin/bash
list="a b c"
for i in $list; do
  echo $i
done
Run Code Online (Sandbox Code Playgroud)

这有效:

?  ~  ./lol.sh 
a
b
c
Run Code Online (Sandbox Code Playgroud)

这不会:

?  ~  . ./lol.sh 
a b c
Run Code Online (Sandbox Code Playgroud)

为什么 split 不适用于 dot 命令,我该如何解决?

Cha*_*ffy 7

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

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

这有几个原因是可取的。

在 ZSH 中:

  • ZSH 通过在未加引号的扩展上根本不执行字符串拆分来破坏 POSIX,除非他们明确要求它。您可以通过运行setopt sh_word_split或使用参数扩展${=list}${(ps: :)list}

在其他 Bourne 派生的 shell 中:

  • 字符串拆分取决于 IFS 的值,不能保证它是默认值,尤其是当来自单独的脚本(可能已在本地更改它)时。
  • 未加引号的扩张也进行通配符,它可以有不同的结果取决于哪个文件是在当前工作目录(例如,如果清单中hello[world],这将表现在一个意想不到的方式,如果你的当前目录包含命名的文件hellowhelloo或以其他方式匹配球)。
  • 避免通配步骤不仅更正确,而且更有效。