Risposte:
$-
sono i flag delle opzioni correnti impostati dalla shell stessa, su invocazione o usando il set
comando incorporato:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
è la sintassi per la rimozione di stringhe: (dalla documentazione POSIX )
$ {Parametro # [parola]}
Rimuovi modello prefisso più piccolo. La parola deve essere espansa per produrre uno schema. L'espansione del parametro deve quindi comportare il parametro, con la parte più piccola del prefisso abbinata al modello cancellato. Se presente, la parola non deve iniziare con un '#' non quotato.
$ {Parametro ## [parola]}
Rimuovi modello prefisso più grande. La parola deve essere espansa per produrre uno schema. L'espansione del parametro deve quindi comportare il parametro, con la maggior parte del prefisso abbinata al modello eliminato.
Quindi ${-#*i}
rimuovi la stringa più corta fino al primo i
carattere:
$ echo "${-#*i}"
mBH
Nel tuo caso, if [ "${-#*i}" != "$-" ]
controlla se la tua shell è interattiva o meno.
C'è un parametro di shell $-
. Nel mio caso:
$ echo $-
himB
${-}
è uguale a $-
esattamente come ${foo}
è uguale a $foo
.
#*i
significa: Elimina (il meno possibile; qui non fa differenza) dall'inizio del valore della variabile fino a (incluso) il primo i
.
$ echo "${-#*i}"
mB
In altre parole: [ "${-#*i}" != "$-" ]
controlla se c'è un i
valore nel valore della $-
variabile, cioè controlla se la shell è interattiva.
In altre parole, è un modo contorto e non compatibile con Bourne di scrivere:
case $- in
*i*) ...;;
*) ...;;
esac