![](https://seccdn.libravatar.org/avatar/5a58405172c31a4cdc02b4c1198a058c.jpg?s=120&d=mm&r=g)
Hallo, folgende Zeilen benötige ich für ein shellscript: problemlos funktioniert noch folgendes: ... anfang="df -h /dev/hdb1" ende=`$anfang` echo $ende ... ende2=`$anfang` echo $ende2 aber wenn ich in die df-Zeile noch ein "|" einbaue, also z.B. ... anfang="df -h /dev/hdb1|tail -n 1" ende=`$anfang` echo $ende ... ende2=`$anfang` echo $ende2 erhalte ich ein: df: Ungültige Option -- n »df --help« gibt weitere Informationen. df: Ungültige Option -- n »df --help« gibt weitere Informationen Die Zeile df -h /dev/hdb1|tail -n 1 an der Konsole eingetippt funktioniert hingegen problemlos. Ich möchte halt gerne, dass ich den Ausdruck df -h /dev/hdb1|tail -n 1 (im Script wird er noch komplexer) nur einmal im Script hineinschreiben muss, damit ich bei einer evtl Änderung diesen nur an _einer_ Stelle ändern muss. Weiß jemand wie ich hierfür vorgehen muss? Viele Grüße Dieter
![](https://seccdn.libravatar.org/avatar/208f884b860bee2b1a5f890e5c5756d7.jpg?s=120&d=mm&r=g)
Dieter Kroemer schrieb:
problemlos funktioniert noch folgendes:
Nein, das ist schon alles andere als problemlos... :-)
... anfang="df -h /dev/hdb1"
ende=`$anfang` echo $ende ... ende2=`$anfang` echo $ende2 [...] Ich möchte halt gerne, dass ich den Ausdruck df -h /dev/hdb1|tail -n 1 (im Script wird er noch komplexer) nur einmal im Script hineinschreiben muss, damit ich bei einer evtl Änderung diesen nur an _einer_ Stelle ändern muss.
anfang=`df -h /dev/hdb1 | tail -n 1` Die Backticks sorgen dafuer, dass der Befehl dazwischen ausgefuehrt wird. Das Ergebnis wird dann der Variablen anfang zugewiesen. Den Inhalt der Variablen anfang einer anderen Variablen ende zuweisen, geht dann einfach mit ende="$anfang" HTH, Thomson
![](https://seccdn.libravatar.org/avatar/cfb9f39322922893a383c14557b27789.jpg?s=120&d=mm&r=g)
Am Samstag, 6. September 2003 16:06 schrieb Thomas Hertweck:
Dieter Kroemer schrieb:
anfang="df -h /dev/hdb1"
ende=`$anfang` echo $ende ... ende2=`$anfang` echo $ende2 [...] Ich möchte halt gerne, dass ich den Ausdruck df -h /dev/hdb1|tail -n 1 (im Script wird er noch komplexer) nur einmal im Script hineinschreiben muss, damit ich bei einer evtl Änderung diesen nur an _einer_ Stelle ändern muss.
anfang=``
Die Backticks sorgen dafuer, dass der Befehl dazwischen ausgefuehrt wird. Das Ergebnis wird dann der Variablen anfang zugewiesen. Den Inhalt der Variablen anfang einer anderen Variablen ende zuweisen, geht dann einfach mit
ende="$anfang"
Hier hat $ende aber immer den gleichen Wert, den $anfang ganz am Anfang zugewiesen bekommen hat, und nicht den aktuellen Wert für den freien Speicher. Falls ich Dieter richtig verstanden habe, sucht er eher sowas: alias anfang='df -h /dev/hdb1 | tail -n 1' ende=`anfang`
HTH, Thomson
Tschüs, Christian
![](https://seccdn.libravatar.org/avatar/208f884b860bee2b1a5f890e5c5756d7.jpg?s=120&d=mm&r=g)
Christian Schneider schrieb:
Am Samstag, 6. September 2003 16:06 schrieb Thomas Hertweck:
[...] anfang=`` [...] ende="$anfang"
Hier hat $ende aber immer den gleichen Wert, den $anfang ganz am Anfang zugewiesen bekommen hat, und nicht den aktuellen Wert für den freien Speicher.
Das ist korrekt.
Falls ich Dieter richtig verstanden habe, sucht er eher sowas:
alias anfang='df -h /dev/hdb1 | tail -n 1'
ende=`anfang`
Das ist der Anfang vom Ende ... :-) Waere auch moeglich. Das ist halt das Dumme an der Geschichte, wenn jemand eine recht inkonkrete Frage stellt und nicht das komplette Problem umreisst. Dann gibt es oft unterschiedliche Auslegungen... Habe das dann wohl falsch verstanden. CU, Th.
![](https://seccdn.libravatar.org/avatar/5a58405172c31a4cdc02b4c1198a058c.jpg?s=120&d=mm&r=g)
Hallo Christian und andere Helfer, Am Samstag, 6. September 2003 16:43 schrieb Christian Schneider:
Falls ich Dieter richtig verstanden habe, sucht er eher sowas:
Du hast mich richtig verstanden :-))
alias anfang='df -h /dev/hdb1 | tail -n 1'
ende=`anfang`
Wenn ich dieses alias an der Konsole eingebe, erfüllt es genau das, was ich möchte, aber im Script funktioniert es nicht :-(( Es kommt die Fehlermeldung line 1: anfang: command not found Könnt ihr mir noch ein bisschen weiterhelfen? Viele Grüße Dieter
![](https://seccdn.libravatar.org/avatar/95332641ed1351b3477f4d1d7919d8dc.jpg?s=120&d=mm&r=g)
Dieter Kroemer schrieb:
Hallo Christian und andere Helfer,
Servus!
Am Samstag, 6. September 2003 16:43 schrieb Christian Schneider:
Falls ich Dieter richtig verstanden habe, sucht er eher sowas:
Du hast mich richtig verstanden :-))
alias anfang='df -h /dev/hdb1 | tail -n 1'
ende=`anfang`
Wenn ich dieses alias an der Konsole eingebe, erfüllt es genau das, was ich möchte, aber im Script funktioniert es nicht :-((
Es kommt die Fehlermeldung line 1: anfang: command not found
Könnt ihr mir noch ein bisschen weiterhelfen?
Es ist alles eine Frage der richtigen Hochkommas... Du hast drei zur Auswahl :-)) Steht in der ersten Zeile Deines Skriptes eigentlich etwas wie #!/bin/sh oder #!/bin/bash ? Gruß, Uli
![](https://seccdn.libravatar.org/avatar/cfb9f39322922893a383c14557b27789.jpg?s=120&d=mm&r=g)
Hallo, Am Samstag, 6. September 2003 21:01 schrieb Dieter Kroemer:
Am Samstag, 6. September 2003 16:43 schrieb Christian Schneider:
Falls ich Dieter richtig verstanden habe, sucht er eher sowas:
Du hast mich richtig verstanden :-))
alias anfang='df -h /dev/hdb1 | tail -n 1'
ende=`anfang`
Wenn ich dieses alias an der Konsole eingebe, erfüllt es genau das, was ich möchte, aber im Script funktioniert es nicht :-((
Es kommt die Fehlermeldung line 1: anfang: command not found
Könnt ihr mir noch ein bisschen weiterhelfen?
In einem Bash-Skript muss vorher noch folgende Zeile eingefügt werden: shopt -s expand_aliases (Gefunden in: Advanced Bash-Scripting Guide, Kapitel 24; S. 287.) Allerdings wird dort die Verwendung von Funktionen anstelle von aliases nahegelegt (wie auch David Haller schon vorgeschlagen hat).
Viele Grüße Dieter
Tschüs, Christian
![](https://seccdn.libravatar.org/avatar/95332641ed1351b3477f4d1d7919d8dc.jpg?s=120&d=mm&r=g)
Dieter Kroemer schrieb:
Hallo,
Hi! <schnipp>
anfang="df -h /dev/hdb1"
<schnapp> Böse Falle: " `?' (Hoffe, dass das durch die Mail-Clients richtig dargestellt wird) Mit Anführungszeichen " übergibst Du einer Variable einen Wert. Mit dem Rückwärts-Hochkomma ` (Backticks, Accent Graph(?)) kannst Du als Wert auch Befehlsketten übergeben. Grüße aus dem Bergischen Land, Uli
![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, On Sat, 06 Sep 2003, Dieter Kroemer schrieb:
anfang="df -h /dev/hdb1"
ende=`$anfang` [..] aber wenn ich in die df-Zeile noch ein "|" einbaue, also z.B. ... anfang="df -h /dev/hdb1|tail -n 1"
ende=`$anfang` [..] erhalte ich ein: df: Ungültige Option -- n [..] Die Zeile df -h /dev/hdb1|tail -n 1 an der Konsole eingetippt funktioniert hingegen problemlos.
Dein Problem ist die Art, in der die shell die Kommandos auswertet. Es wird die der gesamte Variableninhalt als _ein_ Kommando betrachtet, mithin wird alles inklusive und nach der Pipe als weitere Argumente an den ersten Befehl uebergeben: ==== set -x a="date '+%s %T' | cut -d' ' -f2" x=`$a` ==== + a=date '+%s %T' | cut -d' ' -f2 ++ date ''\''+%s' '%T'\''' '|' cut '-d'\''' ''\''' -f2 ^^^^... das alles bekommt date noch als Argument/Option uebergeben, da $a als _ein_ Kommando angesehen wird. Loesung1: ein erneutes Auswerten der Kommandozeile, und somit der Pipe erzwingen: ==== set -x a="date '+%s %T' | cut -d' ' -f2" x=`eval "$a"` sleep 2 y=`eval "$a"` echo "x='$x', y='$y'" ==== ==== + a=date '+%s %T' | cut -d' ' -f2 ++ eval 'date '\''+%s %T'\'' | cut -d'\'' '\'' -f2' +++ date '+%s %T' +++ cut '-d ' -f2 + x=19:11:15 [..] x='19:11:15', y='19:11:17' ==== Wie man sieht, werden nun also 2 durch eine pipe verbundene Kommandos ausgefuehrt... Loesung2: verwende eine Funktion statt einer Variablen: ==== set -x a() { date '+%s %T' | cut -d' ' -f2; } x=`a` sleep 2 y=`a` echo "x='$x', y='$y'" ==== Das ist wohl die "sauberste" Loesung... -dnh -- [OE] Zusätzlich muß man auf automatischen Zeilenumbruch sowie automatisch eingefügte Signaturen verzichten und bei Antworten auf qp-codierte Artikel das Quoting manuell nachbearbeiten. Da kann man seine Artikel auch gleich per telnet localhost 119 einliefern. [Marc Haber in dcsn]
participants (5)
-
Christian Schneider
-
David Haller
-
Dieter Kroemer
-
Thomas Hertweck
-
Ulrich Klenk