Verwendung while read
Loop:
: > 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 input liest, ist es eine gute Idee, einen anderen fd für die Eingabe zu verwenden, damit die Befehle ihn nicht essen (hier unter der Annahme ksh
, zsh
oder bash
für -u 3
, <&3
stattdessen portabel zu verwenden):
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 man laufen als:
bash script.sh file another_file
Extra 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 nachfolgenden Leerzeichen trennen zu lassen.
<file xargs -L 1 -I{} command --option {} other args
Halten Sie sich genau an die Frage:
quelle
Die beste Antwort, die ich gefunden habe, ist:
BEARBEITEN:
... vier Jahre später ...
nach mehreren downstimmen und etwas mehr erfahrung würde ich nun folgendes empfehlen
quelle
do "$cmd" "$i";
) angeben, es sei denn, Sie haben einen Grund, dies nicht zu tun. Wenn die Datei*
ein Wort für sich enthalten würde$cmd *
, würde Ihr Code ausgeführt , der natürlich den Befehl mit einer Liste der Dateien im aktuellen Verzeichnis ausführen würde .zsh
, das`cat`
würde schon das erweitern*
(das nicht zitierte$i
könnte noch etwas Wildcard erweitern (eine zweite Runde) wenn die Erweiterung von`cat`
einiges einführt). Auf jeden Fall ist dieser Ansatz in der Tat falsch.AUSGABE
quelle
Nehmen Sie alle Zeilen einer Datei und übergeben Sie sie als Argumente an einen einzelnen Befehl, dh
Wenn Sie das
--option
Flag vor jeder Zeile benötigen , ändern Sie den zweiten Befehl in:quelle
'
,"
,<
,>
,;
, etc. (3) Dies bedeutet eine unnötige temporäre Datei. (4) Solche Dinge werden im Allgemeinen mit "hier Dokumenten" gemacht. (5) Ihreed
Befehle sind ungeschickt; Die ersten beiden Befehle können auf%s/^/ /
und reduziert werden%j
.