Відповіді:
$-є поточними прапорами опцій, встановленими самою оболонкою, при виклику або за допомогою 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значення $-змінної, тобто перевіряє, чи оболонка інтерактивна.
Іншими словами, це складний і не Борн сумісний спосіб писати:
case $- in
*i*) ...;;
*) ...;;
esac