2016-09-10 5 views
0

ich dieses Skript vor kurzem bekam eine Zeichenfolge in der Befehlszeile aguments zum Spiel:Bedeutung der @ # in der Schale

if [[ "[email protected]" == "${@#foo}" ]]; then echo "not found" ; else echo "found"; fi 

Sieht aus wie es negativ Suche tut. Was ist die Bedeutung von @# genau?

Antwort

2

aus man bash unter Parameter Expansion:

${parameter#word}
${parameter##word}

Remove passenden Präfix-Muster. Das Wort wird erweitert, um ein Muster genau wie bei der Pfadnamenerweiterung zu erzeugen. Wenn das Muster den Beginn des Wertes des Parameters übereinstimmt, dann ist das Ergebnis der Expansion ist der aufgeweitete Wert von Parametern mit dem kürzesten Übereinstimmungsmuster (der # Fall) oder den längsten Anpassungsmustern (der ## Fall) gelöscht . Wenn der Parameter@ oder * ist, wird die Musterentfernungsoperation auf jeder Positionsparameter der Reihe nach angewendet, und die Erweiterung ist die resultierende Liste. Wenn der Parameter eine Arrayvariable ist, die mit @ oder * indiziert ist, wird das Muster removal operation nacheinander auf jedes Mitglied des Arrays angewendet, und die Erweiterung ist die resultierende Liste.

Die [email protected] wird in die Liste der Skriptargumente erweitert jeweils in Anführungszeichen eingeschlossen:

"$1" "$2" "$3"... 

damit die "${@#foo}" auf eine Liste in der angegebenen Skript Argumente mit gezupft Präfix foo wenn solche Präfix existieren erweitern würde ein erweiterten Strings, dh das Skript test:

#!/bin/bash 
echo "${@#foo}" 

aufgerufen, wie:

./test abc foodef 

Ausgänge

abc def 
+0

Dank, dass es erklärt. – devd