"${-#*i}" != "$-" 是什么意思?

"${-#*i}" != "$-" 是什么意思?

/etc/profile我看到这个:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

这是什么${-#*i}意思。我找不到参数扩展的定义${-

答案1

$-是 shell 本身在调用时或使用set内置命令设置的当前选项标志:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"是字符串删除的语法:(来自POSIX 文档

${参数#[字]}

删除最小前缀模式。该词应扩展以产生一种模式。然后,参数扩展应产生参数,其中前缀的最小部分与删除的模式匹配。如果存在,单词不得以不带引号的“#”开头。

${参数##[字]}

删除最大前缀模式。该词应扩展以产生一种模式。然后,参数扩展应产生参数,其中前缀的最大部分与删除的模式匹配。

因此${-#*i}删除最短的字符串直到第一个i字符:

$ echo "${-#*i}"
mBH

对于您的情况,if [ "${-#*i}" != "$-" ]检查您的 shell 是否是交互式的。

答案2

有一个shell参数$-。就我而言:

$ echo $-
himB

${-}$-完全一样${foo}与 相同$foo

#*i意思是:从变量值的开头删除(尽可能少;这里没有区别)直到(包括)第一个i.

$ echo "${-#*i}"
mB

换句话说:检查变量的值中[ "${-#*i}" != "$-" ]是否有an ,即检查shell是否是交互式的。i$-

换句话说,这是一种复杂且与 Bourne 不兼容的编写方式:

case $- in
  *i*) ...;;
  *) ...;;
esac

相关内容