PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unterschied "<->'



Alphager
17.01.2005, 17:08
Ich bin gerade dabei, mich ins Thema Unix-Scripting einzuarbeiten und stoße beim nachvollziehen von Scripten immer wieder auf den Gebrauch von deoppelten (") und einfachen (') Anführungszeichen.
Was genau bewirken sie ?

Xanti
17.01.2005, 17:19
Beide dienen dazu, etwas zusammenzufassen. Zum Beispiel lassen sich damit Dateinamen mit Leerzeichen (eine dämliche Windows-Unsitte) ansprechen, etwa
rm "Dies ist ein File"

Der Unterschied zwischen ' und " liegt darin, wie eingeschlossene Sonderzeichen interpretiert werden. Ein einfaches Beispiel:

a=test
echo "$a" ---> liefert test
echo '$a' ----> liefert $a


Gruss, Phorus

tr0nix
17.01.2005, 21:03
Ich stimme Phorus zu mit weiteren Beispielen:

echo "Hallo" -> Hallo
echo "\"Hallo\"" -> "Hallo"
echo ' "Hallo" ' -> "Hallo"

echo "\"Hallo\" das \"ist\" mit \"der\" Zeit \"mühsam\" vorallem \"mit\" viel \$\$!"
-> "Hallo" das "ist" mit "der" Zeit "mühsam" vorallem "mit" viel $$!

echo '"Hallo" das "ist" mit "der" Zeit "mühsam" vorallem "mit" viel $$!'
-> "Hallo" das "ist" mit "der" Zeit "mühsam" vorallem "mit" viel $$!


Geht aber (leider) auch ohne alles in " bzw. ' zu fassen:

echo '$variable' ist nicht zu unterschätzen

Ist jedoch nicht sehr sauber und sollte vermieden werden.

Gruess
Joel

codc
17.01.2005, 21:06
a=test
echo "$a" ---> liefert test
echo '$a' ----> liefert $a



/klugscheiss on
wobei echo \$a dem echo '$a' entspricht
/klugscheiss off

tr0nix
17.01.2005, 21:22
Das hat er ja nicht ausgeschlossen ;), würde aber so noch in meiner Ergänzung stehen.

pinky
17.01.2005, 22:47
um das ganze komplett zu machen gibt es auch noch ` `. Hier wird der Teil in `` quasi in einer eigenen shell ausgeführt und die Ausgabe des Befehls in `` wird eingesetzt.

tr0nix
17.01.2005, 22:58
BTW eigene Shell.. das finde ich ein wenig merkwürdig:

[tr0nix@feddie ~]$ echo `export test=blah` blah
blah
[tr0nix@feddie ~]$ echo $test

[tr0nix@feddie ~]$ echo `echo $$` blah
4058 blah
[tr0nix@feddie ~]$ ps -ef | grep 4058
tr0nix 4058 4057 0 23:00 pts/2 00:00:00 /bin/bash
tr0nix 4081 4058 0 23:01 pts/2 00:00:00 ps -ef
tr0nix 4082 4058 0 23:01 pts/2 00:00:00 grep 4058
[tr0nix@feddie ~]$ echo $$
4058
Dachte zuerst Kommandosubstitution ist nicht auf einer neuen Shell, was mir durch die Ausgabe der Prozess-ID ($$) bestätigt wurde. Komischerweise lässt sich dennoch in Kommandosubstitution keine Variablen exportieren.

Komisch.. aber vielleicht bin ich einfach nur zu müde!

oenone
17.01.2005, 22:59
wobei `foo` äquivalent zu $(foo) ist :)

auf bald
oenone

tr0nix
17.01.2005, 23:12
oldschool Fetishist ;). Ok, in den LPIC-1 Prüfungen war das zwar ne Frage...

codc
17.01.2005, 23:18
oldschool Fetishist ;). Ok, in den LPIC-1 Prüfungen war das zwar ne Frage...

Jau - gleich hatte ich auch

Alphager
18.01.2005, 10:41
zur Sicherheit eine Rückfrage:
mit ' umschlossener Text wird als reiner Text behandelt ('$a' wird nicht durch den Inhalt von $a ersetzt).
mit " umschloßener Text wird "normal" abgearbeitet, als ob die " nicht vorhanden wären.

Stimmt das so, oder besteht nochmal ein Unterschied zum kompletten weglassen der Anführungszeichen ?

Xanti
18.01.2005, 10:46
Es wird "gruppiert"! Also


touch "Dies ist ein File"
rm Dies ist ein File ---> geht nicht
rm "Dies ist ein File" ---> geht

Alphager
18.01.2005, 11:14
das heißt also:
touch '$test file' -> Datei mit dem Namen "$test file" wird erstellt
touch "$test file" -> Datei mit dem NAmen " file" wird erstellt(sofern $test leer war).

ich glaube, so langsam habe ich es verstanden.
DANKE !

tr0nix
18.01.2005, 13:09
Ja genau. Am einfachsten ist sonst immer noch selbst ausprobieren!

Auch lustig:
file="das ist file"
rm $file -> versucht "das", "ist" und "file" zu loeschen
rm '$file' -> versucht "$file" zu loeschen

Loesung:
rm "$file" -> loescht "das ist file"

Also in Shellscripts die mit Variablen arbeiten ist das setzen von "'s sehr angebracht!

Schlaubi_fi.de
19.01.2005, 10:01
Auch lustig:
file="das ist file"
rm $file -> versucht "das", "ist" und "file" zu loeschen


Das ist auch logisch, weil die Shell zuerst eine Command Substition durchführt,
bevor etwas ausgeführt wird. D.h. es wird zuerst versucht die Kommandozeile
aufzulösen:

rm $file
rm das ist file

und das geht natürlich in die Hose - die " die du vorher bei der Variable $file
gesetzt hast, gehen verloren.

tr0nix
19.01.2005, 11:16
schlaubi, das ist mir schon klar. Aber dieser Thread geht darum, jemandem "neuen" die ueblichen Anfaengerprobleme zu erleichtern.

Xanti
19.01.2005, 11:48
@tr0nix: jetzt weisst Du, warum er Schlaubi heisst ;)

@Schlaubi..: Genau genommen handelt es sich nicht um eine Command Substitution, sondern um eine Parameter Expansion.

Gruss, Phorus

Schlaubi_fi.de
20.01.2005, 12:15
schlaubi, das ist mir schon klar. Aber dieser Thread geht darum, jemandem "neuen" die ueblichen Anfaengerprobleme zu erleichtern.

Sorry, ich wollte dich damit nicht persönlich angreifen.



Genau genommen handelt es sich nicht um eine Command Substitution, sondern um eine Parameter Expansion.

Stimmt :oldman