
Ich habe den folgenden Befehl in einem Linux-Skript.
#!/bin/bash
for i in "001 ARG1" "002 ARG2" "003 ARG3"
do
set -- $i
echo $1
echo $2
done
001 und ARG1 sind im Wesentlichen Tupel,
Gibt es eine Möglichkeit, diese Tupel in eine Textdatei zu verschieben, die ich stattdessen in die For-Schleife laden kann? Bei vielen würde ich eine Textdatei wie diese speichern
ARG1
ARG2
ARG3
oder
001 ARG1
002 ARG2
003 ARG3
Und das Skript wäre
for i in textfile.txt
do
set -- $i
echo $1
echo $2
done
und das gleiche Ergebnis erhalten?
gibt es auch eine Möglichkeit, es so zu machen, dass 001 002 automatisch gezählt wird? So wie man in Python Zähler = 0 und Zähler+=1 setzen und eine Variable zuweisen könnte.
Antwort1
Gegeben sind zwei durch Leerzeichen oder Tabulatoren getrennte Wörter in jeder Zeile einer Datei, wie in Ihrem zweiten Beispiel der Eingabedatei:
while read -r word1 word2; do
echo "$word1"
echo "$word2"
done <textfile.txt
Dadurch wird das erste Wort jeder Zeile in $word1
und der Rest der Zeile in gelesen $word2
.
Der Input hierfür read
erfolgt durch die Eingabe des while
Compound-Kommandos, welches diesen über eine Umleitung aus der Datei bezieht.
Die -r
Option verhindert , dass das Zeichen in der Eingabe auf eine spezielle Weise read
interpretiert wird.\
Mit einem einzelnen Wort pro Zeile und einem Zähler:
counter=0
while read -r word; do
counter=$(( counter + 1 ))
echo "$counter"
echo "$word"
done <textfile.txt
Dadurch wird der Zähler bei jeder Iteration (für jede gelesene Zeile) um eins erhöht textfile.txt
.
Um einen mit Nullen aufgefüllten dreistelligen Zähler zu erhalten, geben Sie den Zähler printf
mit der folgenden Formatierungszeichenfolge aus %.3d\n
:
printf '%.3d\n' "$counter"
... anstelle von echo "$counter"
.
Eine Beschreibung der %.3d\n
Bedeutung finden Sie in der Dokumentation der C-Bibliotheksfunktion printf
( man 3 printf
, das Shell-Äquivalent verwendet hauptsächlich dieselbe Formatzeichenfolge).