Befehlsersetzung funktioniert nicht innerhalb der For-Schleifenbedingung

Befehlsersetzung funktioniert nicht innerhalb der For-Schleifenbedingung

for (( a=1;a<=$(wc -l sedtest1);a++ ));do echo $a; done

Gibt mir einen Fehler:

-bash: ((: a<=21 sedtest1: syntax error in expression (error token is "sedtest1")

Antwort1

Die Ausgabe wc -l sedtest1sieht ungefähr so ​​aus:

21 sedtest1

Der Test wird also in etwa so aussehen a <= 21 sedtest1: „ist ungültig.“

Das bedeutet auch, dass der wcBefehl bei jeder Iteration der Schleife ausgeführt wird. Wenn sich der Inhalt der sedtest1Datei zwischen den einzelnen Iterationen nicht ändert, wäre es besser, diese Zeilenanzahl zunächst in einer Variablen außerhalb der Schleife zu speichern:

n=$(wc -l < sedtest1) # using redirection avoids the output containing the filename
for ((a = 0; a < n; a++)); do echo "$a"; done

Ich vermute auch, dass Sie versuchen, eine Schleife zu verwenden, um Text auf eine ineffiziente und nicht Shell-basierte Weise zu verarbeiten. Vielleicht möchten Sie lesenWarum gilt die Verwendung einer Shell-Schleife zur Textverarbeitung als schlechte Praxis?. Auf diese Weise jede Zeile einer Datei zu durchlaufen, ist nicht der richtige Weg.

Antwort2

Egal, ich war einfach unglaublich dumm … wc -l filegibt als „x-Datei“ aus.

Alles was ich tun musste, war Folgendes: for (( a=1;a<=$(wc -l sedtest1|awk '{print $1}');a++ ));do echo $a; done

verwandte Informationen