"for file in path" 语法中的 zsh escape white space

zsh escape white space in the "for file in path" syntax

我想在 Mac OSX.

上使用 zsh 脚本循环访问“/test/my project/abc/*”中的文件
path="/test/my project/abc/*"
for file in ${path}; do
    something
done

会导致白色space不被转义而发生错误。

我也试过了

path="/test/my project/abc/*"
for file in "${path}"; do
    something
done

在大多数其他用法中,这种转义方法会起作用,但在“for ... in ...”的情况下,它会将整个“${path}”视为字符串数组,并且只列出单个字符串。

我被卡住了,如有任何帮助,我们将不胜感激。

zsh 中默认关闭带有变量扩展的文件 globbing。您必须使用 ${~...}:

明确请求它
ls 'sub dir'; print

p="sub dir/*"
for f in ${~p}; do
    print "in loop: [$f]"
done

输出:

fl1     fl2     fl3

in loop: [sub dir/fl1]
in loop: [sub dir/fl2]
in loop: [sub dir/fl3]

请注意,这不会使用 path 作为变量名。 path 通常绑定到 PATH 变量,实际上是 zsh 中的保留字。这可能就是为什么您在示例中看到不同结果的原因;在默认的 zsh 配置中,带引号和不带引号的形式都应该只是 return 模式而不是 glob 结果。

更多信息:

  • zshexpn - 此手册页描述了 ${~spec}
  • GLOB_SUBSTzshoptions中有描述。这是另一种使用变量 expansion 强制通配的方法,但设置此选项通常不是一个好主意。
  • 关于 pathPATHtypeset -T 的一些注释:

首先,不要命名您自己的变量path。此名称在 zsh 中具有特殊含义,如果您 fiddle 以与 zsh 设计者预见的不同方式使用此变量,您可能会观察到各种有趣的效果。

其次,由于您的变量 - 我们称它为 pathes - 应该表示一组路径,因此使用数组更有意义:

pathes=(/test/my project/abc/*)
for file in $pathes[@]
do
  something
done