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


37

/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}意思 我找不到开始的参数扩展的定义${-

Answers:


40

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

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

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

$ {parameter#[word]}

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

$ {parameter ## [word]}

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

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

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

在您的情况下,请if [ "${-#*i}" != "$-" ]检查您的外壳是否是交互式的。


23

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

$ echo $-
himB

${-}$-完全相同${foo}相同$foo

#*i表示:从变量值的开头删除(包括第一个)(尽可能少;在这里不起作用)i

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

换句话说:[ "${-#*i}" != "$-" ]检查变量i的值是否存在$-,即检查外壳是否是交互式的。

换句话说,这是一种复杂且非伯恩兼容的书写方式:

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

4
不过,它 POSIX兼容
grawity 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.