这在 BASH 中效果很好:
$ where=/sys/class/backlight/*
$ echo $where
/sys/class/backlight/intel_backlight
然而,当将 POSIX 脚本作为解释器放入时/bin/sh
,这不起作用,where
变成了/sys/class/backlight/*
.
我尝试过谷歌,但可能我没有使用正确的术语。
这在 BASH 中效果很好:
$ where=/sys/class/backlight/*
$ echo $where
/sys/class/backlight/intel_backlight
然而,当将 POSIX 脚本作为解释器放入时/bin/sh
,这不起作用,where
变成了/sys/class/backlight/*
.
我尝试过谷歌,但可能我没有使用正确的术语。
变量的值
where
始终是字符串/sys/class/backlight/*
。一般来说,在语法需要单个单词的上下文中,例如标量赋值的右侧,没有通配符扩展。在语法需要单词列表(例如命令及其参数或数组赋值的右侧)的上下文中,存在通配符扩展(以及单词分割)。请参阅shell 变量的扩展以及 glob 和 split 对它的影响以及何时需要双引号?更多细节。$where
如果在列表上下文中使用通配符,则扩展通配符。据推测,在您的脚本中,您放入$where
了双引号(这使得整个内容成为一个单词)或在其他单词上下文中。如果您的脚本是 bash(不是普通 sh)脚本,您可以创建
where
一个数组:然后您可以使用
"${where[@]}"
背光设备的目录列表。奇怪的是, ksh$where
相当于${where[0]}
,即采用数组的第一个元素并忽略其余元素,因此如果您假设有一个设备,您可以继续$where
在单词上下文中使用。