x11-common
包安装/etc/X11/Xsession.d/20x11-common_process-args
脚本,该脚本由/etc/X11/Xsession
提供。此20x11-common_process-args
脚本包含以下if语句:
has_option() {
if [ "${OPTIONS#*
$1}" != "$OPTIONS" ]; then
return 0
else
return 1
fi
}
OPTIONS
变量是由换行符分隔的文件中的配置选项列表(ASCII中为0a)。如何理解这个if语句?从字面上看,这个参数扩展部分应该修改OPTIONS变量,以便删除参数($ 1)之前的所有内容?此参数需要匹配其中一个配置选项。但是,这个if语句的一般含义是什么?
答案 0 :(得分:3)
这段代码:
xyz=gobbledegook
echo ${xyz#*de}
回应“gook”,因此${OPTIONS#*$1}
符号会删除从$OPTIONS
一直到的所有内容,包括 $1
。
在脚本中,它正在检查$1
中的选项列表中是否存在$OPTIONS
(函数的第一个参数)。如果值不同,则匹配该选项;否则,它不是。这是一种相当紧凑的方式,可以同时处理很多选项。
测试中的换行符(严格来说,它是在测试中出现的字符串中)是非正统但合法的。
当然,您可以轻松地为自己进行实验:
$ OPTIONS="-abc
> -def
> -ghi"
$ echo "${OPTIONS#*-abc}"
-def
-ghi
$ echo "${OPTIONS#*-def}"
-ghi
$ echo "${OPTIONS#*-ghi}"
$ echo "${OPTIONS#*-xyz}"
-abc
-def
-ghi
$
答案 1 :(得分:1)
您是正确的,参数扩展会从扩展中删除所有内容,包括$1
。如果$1
不存在,则扩展不会删除任何内容,扩展与仅修改$OPTIONS
而不进行修改相同。因此,如果if
包含OPTIONS
(即两个扩展不同),$1
语句只返回0,如果不包含$1
则返回1(是,两个扩展是相同的。)
从广义上讲,如果has_option foo
中存在foo
,则$OPTIONS
会成功,如果foo
不存在则会失败。