if abfrage innerhalb einer pipe.

flappinski

flappinski

Foren As
Hallo
Ihr wist ja bestimmt, wie ich eine Entscheidung innerhalb der Pipe treffen kann.
Im folgenden Beispiel steht cut -f1-10 doppelt drin. Das hätte ich nun gerne auserhalb der Schleife, damit ich es nur einmal drin haben muss. Any ideas? Von mir wäre einen Idee, wenn ich cut mit stdout befüttere
(z.B.
cut -f1-10 < /dev/stdout
funktioniert natürlich so nicht....:)).
Vielen Dank,
Stephan

#!/bin/bash

number=$1

if [ $number = "1" ]; then
head -20 File1 | cut -f-10
else
tail -10 File1 | cut -f-10
fi
 
Vielleicht könntest Du das so

Code:
 [ $number == 1 ] && head -20  File1  | cut -f-10 || tail -10 File1  | cut -f-10

lösen.

Gruß Aqualung
 
Hi Aqualung,
danke für Deinen Vorschlag, ich habe mich mal wieder nicht so ganz klar ausgedrückt:
das if, then, else stört mich gar nicht. Was mich stört, ist, dass ich zweimal den cut-befehl drin habe. Denn dieser wird in meinem Originalscript durch etwas viel längeres ersetzt....
Zur Zeit lse ich das, indem ich über einen temporäre Datei gehe, aber das ist ja nicht gerade sehr efizient...
LG,
Stephan
 
wie wäre es mit einer funktion schreiben ? ... die du einfach aufrufst ? ... und ja es gibt funktionen in shellscripten :> auch wenn man sie nicht oft sieht ;)

aber eine anderelösung weis ich jetzt nicht ... evtl ein anderer mfg :)
 
Ist zwar ähnlich wie eine temporäre Datei vom Ansatz her, aber wie wärs mit ner benannten Pfeife?
Siehe dazu "mkfifo" oder "mknod Pipename p".
Dann müsste man das Ding aber in den Hintergrund schicken, irgendwie so:
Code:
mknod /tmp/IMAPIPE p
cut -f-10 < /tmp/IMAPIPE &

if [ $number = "1" ]; then
   head -20 File1 > /tmp/IMAPIPE
else
   tail -10 File1 > /tmp/IMAPIPE
fi

rm /tmp/IMAPIPE
Aber eigentlich ist das das Gleiche in grün.
Dann kann man natürlich auch gleich den "output capturen":
Code:
cut -f-10 < /tmp/IMAPIPE > OUTFILE &
oder so, weißt du aber scheinbar ja schon selber, kommt halt drauf an, was im Skript eigentlich anstatt des "cut"-Kommandos steht.
Ansonsten ist der Weg über eine temporäre Datei mit weniger "overhead" verbunden und von daher eventuell vorzuziehen..
 
Ist zwar ähnlich wie eine temporäre Datei vom Ansatz her, aber wie wärs mit ner benannten Pfeife?
Siehe dazu "mkfifo" oder "mknod Pipename p".
Dann müsste man das Ding aber in den Hintergrund schicken, irgendwie so:
Code:
mknod /tmp/IMAPIPE p
cut -f-10 < /tmp/IMAPIPE &

if [ $number = "1" ]; then
   head -20 File1 > /tmp/IMAPIPE
else
   tail -10 File1 > /tmp/IMAPIPE
fi

rm /tmp/IMAPIPE
Aber eigentlich ist das das Gleiche in grün.
Dann kann man natürlich auch gleich den "output capturen":
Code:
cut -f-10 < /tmp/IMAPIPE > OUTFILE &
oder so, weißt du aber scheinbar ja schon selber, kommt halt drauf an, was im Skript eigentlich anstatt des "cut"-Kommandos steht.
Ansonsten ist der Weg über eine temporäre Datei mit weniger "overhead" verbunden und von daher eventuell vorzuziehen..


also, im moment läuft das ganz prima mit der temporären Datei. Und ich will eigentlich nicht mit so benannten Pfeifen arbeiten (ist das denn Standard). Aber eines läst mich doch nochmal aufhorchen. Den "output capturen", das weiss ich nämlich gar nicht schon selber. Kann ich denn auch den Standard Output capturen? Ich habe ja genau sowas versucht, aber schnell aufgegeben, da es nich gleich funktionierte, und ich nicht wusste, ob es überhaupt geht.
Vielen Dank schon mal,
Stephan
 
Erstmal: die Dinger schimpfen sich "named pipes", ich hab die einfach mal "humoröserweise" benannte Pfeifen genannt.
Damit kann man das selbe machen, wie mit unnamed pipes (|), nämlich den output von einem Kommando als input eines anderen nehmen. Wobei man das normalerweise nimmt, um Prozesse von verschiedenen "Eltern-Shells" miteinandern interagieren zu lassen. (Was mit "anonymen pipes" nicht geht.)

Was ich mit "output capturen" meinte war, einfach den STDOUT von deinem cut-Kommando in eine Datei umzuleiten. (cut -f-10 > OUTFILE)
Jedes Kommando hat ja stdout und stdin. (Und stderr)
Egal, ich hab hier mal was lustiges für dich:
Code:
var=""; echo 'bla' | ([ "$var" ] && cat -n || cat)
bla
und:
Code:
var="uae"; echo 'bla' | ([ "$var" ] && cat -n || cat)
     1  bla
Wäre das nicht, was du willst? Ansonsten ist das auch nicht wirklich wild, wenn ein Kommando zweimal vorkommt, oder? Und wenns ne case-Anweisung sein sollte, kannst du ja notfalls immernoch über ne temporäre Datei gehen...

[Edit]:
Hier das ganze mal etwas "lesbarer":
Code:
var="something"
echo "Irgendein output" | (
  if [ "$var" ]; then
    cat
    echo '$var ist "gefuellt".'
  else
    cat
    echo '$var ist "ungefuellt".'
  fi
)
Also je nachdem, ob $var leer oder "gefüllt" ist, wird entweder der if oder der else Zweig ausgeführt. Die cat-Kommandos bekommen dabei jeweils ihr STDIN vom STDOUT des "äußeren" echo-Kommandos.
 
Zuletzt bearbeitet:

Ähnliche Themen

If-Abfrage kommt nicht positiv zurück, obwohl Kriterium erfüllt

Verschlüsseltes Backup-Script mit rsync

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

mittels if abfrage datei nach variabelnwert durchsuchen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben