Was bedeutet "${-#*i}" != "$-"?

Was bedeutet "${-#*i}" != "$-"?

Ich /etc/profilesehe Folgendes:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

Was bedeutet das ${-#*i}? Ich kann keine Definition einer Parametererweiterung finden, die beginnt ${-.

Antwort1

$-sind aktuelle Optionsflags, die von der Shell selbst, beim Aufruf oder mit dem setintegrierten Befehl gesetzt werden:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"ist die Syntax zum Entfernen von Zeichenfolgen: (ausPOSIX-Dokumentation)

${parameter#[Wort]}

Kleinstes Präfixmuster entfernen. Das Wort muss erweitert werden, um ein Muster zu erzeugen. Die Parametererweiterung muss dann einen Parameter ergeben, wobei der kleinste Teil des Präfixes, der mit dem Muster übereinstimmt, gelöscht wird. Falls vorhanden, darf das Wort nicht mit einem nicht in Anführungszeichen gesetzten „#“ beginnen.

${parameter##[Wort]}

Größtes Präfixmuster entfernen. Das Wort soll erweitert werden, um ein Muster zu erzeugen. Die Parametererweiterung soll dann einen Parameter ergeben, wobei der größte Teil des Präfixes, der mit dem Muster übereinstimmt, gelöscht wird.

Entfernen Sie also ${-#*i}die kürzeste Zeichenfolge bis zum ersten iZeichen:

$ echo "${-#*i}"
mBH

Überprüfen Sie in Ihrem Fall, if [ "${-#*i}" != "$-" ]ob Ihre Shell interaktiv ist oder nicht.

Antwort2

Es gibt einen Shell-Parameter $-. In meinem Fall:

$ echo $-
himB

${-}ist dasselbe wie $-genau wie ${foo}ist dasselbe wie $foo.

#*iheißt: Löschen (so wenig wie möglich, macht hier keinen Unterschied) vom Anfang des Variablenwertes bis (einschließlich) dem ersten i.

$ echo "${-#*i}"
mB

Mit anderen Worten: Überprüft, ob im Wert der Variablen [ "${-#*i}" != "$-" ]ein vorhanden ist , d. h., es wird überprüft, ob die Shell interaktiv ist.i$-

Mit anderen Worten, es ist eine komplizierte und nicht Bourne-kompatible Art zu schreiben:

case $- in
  *i*) ...;;
  *) ...;;
esac

verwandte Informationen