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 cat
den 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 $1
ist der erste Parameter, den Sie an das Skript übergeben, aber Sie übergeben eigentlich keinen. Das bedeutet, dass cat $file
tatsächlich cat
allein steht. Wenn kein Argument angegeben wird, cat
wird einfach die Eingabe gedruckt:
$ echo "foo" | cat
foo
Der erste gibt also cat
die 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 |wc
in 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