Что означает "${-#*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

$-текущие флаги опций, установленные самой оболочкой, при вызове или с помощью setвстроенной команды:

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

"${-#*i}"синтаксис для удаления строки: (изДокументация POSIX)

${параметр#[слово]}

Удалить наименьший префиксный шаблон. Слово должно быть расширено для создания шаблона. Расширение параметра должно затем привести к параметру, при этом наименьшая часть префикса, соответствующая шаблону, будет удалена. Если присутствует, слово не должно начинаться с незакавыченного символа '#'.

${параметр##[слово]}

Удалить самый большой шаблон префикса. Слово должно быть расширено для создания шаблона. Расширение параметра должно затем привести к параметру, при этом наибольшая часть префикса, соответствующая шаблону, будет удалена.

Итак, ${-#*i}удалите самую короткую строку до первого iсимвола:

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

В вашем случае if [ "${-#*i}" != "$-" ]проверяется, является ли ваша оболочка интерактивной или нет.

решение2

Есть параметр оболочки $-. В моем случае:

$ echo $-
himB

${-}то же самое, $-что и . ${foo}то же самое, что и $foo.

#*iозначает: удалить (как можно меньше; здесь это не имеет значения) от начала значения переменной до (включая) первого i.

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

Другими словами: [ "${-#*i}" != "$-" ]проверяет, есть ли iв значении переменной $-, то есть проверяет, является ли оболочка интерактивной.

Другими словами, это запутанный и несовместимый с Борном способ записи:

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

Связанный контент