Respostas:
$-
são os sinalizadores de opção atuais definidos pelo próprio shell, na chamada ou usando o set
comando builtin:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
é uma sintaxe para remoção de string: (da documentação do POSIX )
$ {parâmetro # [palavra]}
Remova o menor padrão de prefixo. A palavra deve ser expandida para produzir um padrão. A expansão do parâmetro resultará em parâmetro, com a menor porção do prefixo correspondida pelo padrão excluída. Se presente, a palavra não começará com um '#' não citado.
$ {parâmetro ## [palavra]}
Remova o maior padrão de prefixo. A palavra deve ser expandida para produzir um padrão. A expansão do parâmetro resultará em parâmetro, com a maior parte do prefixo correspondida pelo padrão excluída.
Portanto, ${-#*i}
remova a corda mais curta até o primeiro i
caractere:
$ echo "${-#*i}"
mBH
No seu caso, if [ "${-#*i}" != "$-" ]
verificando se o seu shell é interativo ou não.
Há um parâmetro de shell $-
. No meu caso:
$ echo $-
himB
${-}
é o mesmo que $-
exatamente ${foo}
igual é o mesmo que $foo
.
#*i
significa: Excluir (o mínimo possível; não faz diferença aqui) desde o início do valor da variável até (incluindo) o primeiro i
.
$ echo "${-#*i}"
mB
Em outras palavras: [ "${-#*i}" != "$-" ]
verifica se existe um i
valor na $-
variável, ou seja, verifica se o shell é interativo.
Em outras palavras, é uma maneira complicada e não-Bourne compatível de escrever:
case $- in
*i*) ...;;
*) ...;;
esac