用位置参数理解参数扩展

时间:2014-03-25 14:02:19

标签: bash

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语句的一般含义是什么?

2 个答案:

答案 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不存在则会失败。