command `< file`
übergibt den Dateiinhalt an den Befehl auf stdin, entfernt jedoch Zeilenumbrüche, was bedeutet, dass Sie nicht jede Zeile einzeln durchlaufen können. Dafür könnten Sie ein Skript mit einer 'for'-Schleife schreiben:
for line in `cat input_file`; do some_command "$line"; done
Oder (die mehrzeilige Variante):
for line in `cat input_file`
do
some_command "$line"
done
Oder (mehrzeilige Variante mit $()
statt ``
):
for line in $(cat input_file)
do
some_command "$line"
done
Referenzen:
- For-Loop-Syntax:https://www.cyberciti.biz/faq/bash-for-loop/
Wie bereits erwähnt, können Sie die Backticks oder $(cat filename)
verwenden .
Was nicht erwähnt wurde, und ich denke, es ist wichtig zu beachten, dass Sie sich daran erinnern müssen, dass die Shell den Inhalt dieser Datei nach Leerzeichen zerlegt und jedes gefundene "Wort" Ihrem Befehl als Argument gibt. Und während Sie möglicherweise ein Befehlszeilenargument in Anführungszeichen setzen können, damit es Leerzeichen, Escape-Sequenzen usw. enthalten kann, wird das Lesen aus der Datei nicht dasselbe tun. Wenn Ihre Datei beispielsweise Folgendes enthält:
a "b c" d
Die Argumente, die Sie erhalten, sind:
a
"b
c"
d
Wenn Sie jede Zeile als Argument ziehen möchten, verwenden Sie das while/read/do-Konstrukt:
while read i ; do command_name $i ; done < filename
Das machst du mit Backticks:
echo World > file.txt
echo Hello `cat file.txt`
Wenn Ihre Shell (unter anderem) bash ist, eine Abkürzung für $(cat afile)
ist $(< afile)
, also würden Sie schreiben:
mycommand "$(< file.txt)"
Dokumentiert in der Bash-Manpage im Abschnitt „Command Substitution“.
Lassen Sie Ihren Befehl alternativ von stdin lesen, also:mycommand < file.txt