Ich möchte ein Skript schreiben, das eine .txt
verwendet filename als Argument, liest die Datei Zeile für Zeile und übergibt jede Zeile an einen Befehl. Beispielsweise wird command --option "LINE 1"
ausgeführt , dann command --option "LINE 2"
usw. Die Ausgabe des Befehls wird in eine andere Datei geschrieben. Wie mache ich das? Ich weiß nicht, wo ich anfangen soll.
Akzeptierte Antwort:
Verwenden Sie while read
Schleife:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Eine andere Möglichkeit besteht darin, die Ausgabe blockweise umzuleiten:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Zuletzt öffnen Sie die Datei:
exec 4> another_file
while IFS= read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Wenn einer der Befehle die Eingabe liest, wäre es eine gute Idee, einen anderen fd für die Eingabe zu verwenden, damit die Befehle ihn nicht fressen (hier unter der Annahme von ksh
, zsh
oder bash
für -u 3
, verwenden Sie <&3
statt portabel):
while IFS= read -ru 3 LINE; do
...
done 3< file
Um schließlich Argumente zu akzeptieren, können Sie Folgendes tun:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while IFS= read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
Welches könnte laufen als:
bash script.sh file another_file
Zusätzliche Idee. Mit bash
, verwenden Sie readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Hinweis:IFS=
kann weggelassen werden, wenn es Ihnen nichts ausmacht, Zeilenwerte von führenden und nachgestellten Leerzeichen zu befreien.