Respuestas:
$-
son las banderas de opciones actuales establecidas por el propio shell, en invocación o usando el set
comando incorporado:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
es la sintaxis para la eliminación de cadenas: (de la documentación POSIX )
$ {parámetro # [palabra]}
Eliminar el patrón de prefijo más pequeño. La palabra se expandirá para producir un patrón. La expansión del parámetro dará como resultado el parámetro, con la porción más pequeña del prefijo emparejada por el patrón eliminado. Si está presente, la palabra no comenzará con un '#' sin comillas.
$ {parámetro ## [palabra]}
Eliminar el patrón de prefijo más grande. La palabra se expandirá para producir un patrón. La expansión del parámetro dará como resultado el parámetro, con la porción más grande del prefijo emparejada por el patrón eliminado.
Entonces, ${-#*i}
elimine la cadena más corta hasta el primer i
carácter:
$ echo "${-#*i}"
mBH
En su caso, if [ "${-#*i}" != "$-" ]
verifique si su shell es interactivo o no.
Hay un parámetro de shell $-
. En mi caso:
$ echo $-
himB
${-}
es lo mismo que $-
exactamente igual ${foo}
es igual a $foo
.
#*i
significa: Eliminar (lo menos posible; no hace ninguna diferencia aquí) desde el comienzo del valor de la variable hasta (incluido) el primero i
.
$ echo "${-#*i}"
mB
En otras palabras: [ "${-#*i}" != "$-" ]
comprueba si hay un i
valor en la $-
variable, es decir, comprueba si el shell es interactivo.
En otras palabras, es una forma enrevesada y no compatible con Bourne de escribir:
case $- in
*i*) ...;;
*) ...;;
esac