"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_SUBST
在zshoptions
中有描述。这是另一种使用变量 expansion 强制通配的方法,但设置此选项通常不是一个好主意。
- 关于
path
、PATH
和 typeset -T
的一些注释:
首先,不要命名您自己的变量path
。此名称在 zsh 中具有特殊含义,如果您 fiddle 以与 zsh 设计者预见的不同方式使用此变量,您可能会观察到各种有趣的效果。
其次,由于您的变量 - 我们称它为 pathes
- 应该表示一组路径,因此使用数组更有意义:
pathes=(/test/my project/abc/*)
for file in $pathes[@]
do
something
done
我想在 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_SUBST
在zshoptions
中有描述。这是另一种使用变量 expansion 强制通配的方法,但设置此选项通常不是一个好主意。- 关于
path
、PATH
和typeset -T
的一些注释:
首先,不要命名您自己的变量path
。此名称在 zsh 中具有特殊含义,如果您 fiddle 以与 zsh 设计者预见的不同方式使用此变量,您可能会观察到各种有趣的效果。
其次,由于您的变量 - 我们称它为 pathes
- 应该表示一组路径,因此使用数组更有意义:
pathes=(/test/my project/abc/*)
for file in $pathes[@]
do
something
done