So behalten Sie den Inhalt einer Variablen nach der Pipe bei

So behalten Sie den Inhalt einer Variablen nach der Pipe bei

Ich habe das folgende Skript

#!/bin/bash
file="$1"
cat $file
n=$(cat $file | wc -l)
cat $file

Ich verwende es so, dass cat some_file.txt | myScript.sh der erste catden Inhalt der Datei ausgibt, der zweite jedoch nicht. Wie kann ich den Inhalt der Variablen nach der Pipe beibehalten?

Antwort1

Dies tut nicht das, was Sie denken. Dies $1ist der erste Parameter, den Sie an das Skript übergeben, aber Sie übergeben eigentlich keinen. Das bedeutet, dass cat $filetatsächlich catallein steht. Wenn kein Argument angegeben wird, catwird einfach die Eingabe gedruckt:

$ echo "foo" | cat
foo

Der erste gibt also catdie Eingabe aus, den Inhalt der Datei. Der zweite hat keine Eingabe, da diese bereits vom ersten übernommen wurde, also tut er nichts. Sie möchten etwas wie Folgendes tun:

myscript.sh file

Dadurch wird der Inhalt der Datei zweimal ausgedruckt und die Ausgabe zusätzlich cat $file |wcin der Variablen gespeichert n.


Wenn Sie den Inhalt der Datei in speichern möchten $file, versuchen Sie Folgendes:

file="$(cat < "$1")"

Und führen Sie das Skript mit dem Dateinamen als Argument aus:

script.sh file

verwandte Informationen