Ответы:
$-это флаги текущей опции, установленные самой оболочкой, при вызове или с помощью setвстроенной команды:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"такое синтаксис для удаления строки: (из документации POSIX )
$ {Параметр # [слово]}
Удалите самый маленький образец префикса. Слово должно быть расширено, чтобы произвести образец. Расширение параметра должно затем привести к параметру с наименьшей частью префикса, совпадающей с удаленным шаблоном. Если присутствует, слово не должно начинаться с кавычки без кавычек.
$ {Параметр ## [слово]}
Удалить самый большой образец префикса. Слово должно быть расширено, чтобы произвести образец. Расширение параметра должно затем привести к параметру, при этом наибольшая часть префикса соответствует удаленному шаблону.
Поэтому ${-#*i}удалите самую короткую строку до первого iсимвола:
$ echo "${-#*i}"
mBH
В вашем случае if [ "${-#*i}" != "$-" ]проверка, является ли ваша оболочка интерактивной или нет.
Есть параметр оболочки $-. В моем случае:
$ echo $-
himB
${-}так же, как $-точно так ${foo}же, как и $foo.
#*iозначает: Удалить (как можно меньше; здесь не имеет значения) от начала значения переменной до (включая) первого i.
$ echo "${-#*i}"
mB
Другими словами: [ "${-#*i}" != "$-" ]проверяет, есть ли iв значении $-переменной значение, то есть проверяет, является ли оболочка интерактивной.
Другими словами, это запутанный и не Bourne-совместимый способ написать:
case $- in
*i*) ...;;
*) ...;;
esac