2016-05-10 20 views
6

Gibt es einen Unterschied zwischen [email protected] und "[email protected]"?

Ich verstehe, dass es Unterschiede für nicht spezielle Zeichen geben kann, aber was ist mit dem @ Zeichen mit Eingabeargumenten?

+1

Die Frage ist kein strenges Duplikat, aber die Antworten dort beantworten auch diese Frage. –

Antwort

9

Ja!

$ cat a.sh 
echo "[email protected]" 
echo [email protected] 

Sagen wir es laufen:

$ ./a.sh 2 "3  4" 5 
2 3  4 5     # output for "[email protected]" 
2 3 4 5      # output for [email protected] -> spaces are lost! 

Wie Sie sehen können, mit [email protected] macht die Parameter zu „verlieren“ einige Inhalte, wenn sie als Parameter verwendet wird. Für eine detaillierte Erklärung siehe zum Beispiel I just assigned a variable, but echo $variable shows something else.


Von GNU Bash manual --> 3.4.2 Special Parameters:

@

($ @) erweitert sich auf die Positionsparameter, ausgehend von einem. Wenn die Erweiterung in doppelten Anführungszeichen auftritt, wird jeder Parameter auf ein separates Wort erweitert. Das heißt, "$ @" entspricht "$ 1" "$ 2" .... Wenn die doppelt zitierte Erweiterung innerhalb eines Worts auftritt, wird die Erweiterung des ersten Parameters mit dem Anfangsteil des ursprünglichen Worts verbunden, und die Erweiterung des letzten Parameters wird mit dem letzten Teil des ursprünglichen Worts verknüpft. Wenn keine Positionsparameter vorhanden sind, expandieren "$ @" und $ @ zu nichts (d. H., Sie werden entfernt).

5

Die Übergabe von $ @ an einen Befehl übergibt alle Argumente an den Befehl. Wenn ein Argument ein Leerzeichen enthält, sieht der Befehl dieses Argument als zwei separate Argumente an.

Die Übergabe von "$ @" an einen Befehl übergibt alle Argumente als String in Anführungszeichen an den Befehl. Der Befehl zeigt ein Argument mit Whitespace als einzelnes Argument mit Leerzeichen an.

Um den Unterschied leicht eine Funktion schreiben, zu visualisieren, dass alle seine Argumente in einer Schleife druckt, einen nach dem anderen:

#!/bin/bash 

loop_print() { 
    while [[ $# -gt 0 ]]; do 
     echo "argument: '$1'" 
     shift 
    done 
} 

echo "#### testing with \[email protected] ####" 
loop_print [email protected] 
echo "#### testing with \"\[email protected]\" ####" 
loop_print "[email protected]" 

den Skript aufrufen mit

<script> "foo bar" 

wird die Ausgabe

produzieren
#### testing with [email protected] #### 
argument: 'foo' 
argument: 'bar' 
#### testing with "[email protected]" #### 
argument: 'foo bar' 
Verwandte Themen