展开匹配单个目录/文件的通配符

展开匹配单个目录/文件的通配符

这在 BASH 中效果很好:

$ where=/sys/class/backlight/*
$ echo $where
/sys/class/backlight/intel_backlight

然而,当将 POSIX 脚本作为解释器放入时/bin/sh,这不起作用,where变成了/sys/class/backlight/*.

我尝试过谷歌,但可能我没有使用正确的术语。

答案1

变量的值where始终是字符串/sys/class/backlight/*。一般来说,在语法需要单个单词的上下文中,例如标量赋值的右侧,没有通配符扩展。在语法需要单词列表(例如命令及其参数或数组赋值的右侧)的上下文中,存在通配符扩展(以及单词分割)。看shell 变量的扩展以及 glob 和 split 对它的影响什么时候需要双引号?更多细节。

$where如果在列表上下文中使用通配符,则扩展通配符。据推测,在您的脚本中,您放入$where了双引号(这使得整个内容成为一个单词)或在其他单词上下文中。

如果您的脚本是 bash(不是普通 sh)脚本,您可以创建where一个数组:

where=(/sys/class/backlight/*)

然后您可以使用"${where[@]}"背光设备的目录列表。奇怪的是, ksh$where相当于${where[0]},即采用数组的第一个元素并忽略其余元素,因此如果您假设有一个设备,您可以继续$where在单词上下文中使用。

相关内容