Что означает «$ {- # * 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}значит Я не могу найти определение начала расширения параметров ${-.

Пит
источник

Ответы:

40

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

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

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

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

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

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

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

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

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

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

cuonglm
источник
23

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

$ echo $-
himB

${-}так же, как $-точно так ${foo}же, как и $foo.

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

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

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

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

case $- in
  *i*) ...;;
  *) ...;;
esac
Хауке Лагинг
источник
4
Это является POSIX-совместимой , однако.
grawity