Zsh 分配非数组变量时的文件名扩展
这是关于Zsh 5.5.1的 假设我有一个glob模式,它只扩展到一个文件,我想把这个文件分配给一个变量。这项工作:Zsh 分配非数组变量时的文件名扩展,zsh,Zsh,这是关于Zsh 5.5.1的 假设我有一个glob模式,它只扩展到一个文件,我想把这个文件分配给一个变量。这项工作: # N: No error if no files match. D: Match dot files. Y1: Expand to exactly one entry. myfile=(*(NDY1)) 并且echo$myfile将显示该文件(或目录)。但这一条不起作用: myfile=*(NDY1) 在后一种情况下,echo$myfile保存模式,即*(NDY1) 当然
# N: No error if no files match. D: Match dot files. Y1: Expand to exactly one entry.
myfile=(*(NDY1))
并且echo$myfile
将显示该文件(或目录)。但这一条不起作用:
myfile=*(NDY1)
在后一种情况下,echo$myfile
保存模式,即*(NDY1)
当然,我可以做一些便宜的把戏,比如通过
myfile=$(echo *(NDY1))
但是有没有一种方法可以在没有这些技巧的情况下进行辅助?默认情况下,zsh在标量赋值中不进行文件名扩展,但是该选项可能会有所帮助。(此选项仅用于向后兼容。) 以下是zsh文档中的一些描述: 标量参数的值也可以通过写入来指定:
name=value
在标量赋值中,值被扩展为单个字符串,其中数组的元素连接在一起;除非设置了该选项,否则不会执行文件名扩展 ---
如果设置了此选项,将在“
name=pattern
”形式的标量参数赋值的右侧执行文件名生成(globbing)(例如foo=*
”)。如果结果包含多个单词,则参数将成为一个数组,并将这些单词作为参数。此选项仅用于向后兼容:全局搜索始终在name=(value)
(例如foo=(*)
)表单的数组分配右侧执行,为清晰起见,建议使用此表单;设置此选项后,无法预测结果是数组还是标量
---
您是否认为
$myfile
和${myfile[1]}
之间的区别很重要?我只想继续数组赋值。@chepner:Yes:如果myfile
是一个数组,$myfile[1]
将展开到数组的第一个元素(在本例中仅为文件名)。如果是标量,$myfile[1]
将扩展到文件名的第一个字符。这与此无关,因为您有一个数组。我的问题是,为什么不使用数组?@chepner。正是为了这个:我想在以后的代码中使用这个变量,我想像使用任何其他标量一样使用它(包括使用下标)。从维护的角度来看,必须始终记住哪些变量是标量,哪些是单元素数组是不好的。当然,我可以做一个myfile=$myfile[1]
,然后去掉数组,但我的问题是,Zsh是否提供了更干净的方法,它在各种构造中都非常丰富。
local myfile=''
() {
setopt localoptions globassign
myfile=*(NDY1)
}
echo $myfile
;#>> something