2016-03-18 23 views
-1

Ich habe ein Problem mit meinen Schleifen. Ich benutze Bash Version 4.1.2.Syntaxfehler - for loop - bash

Mein Code ist folgende:

### List of files to process from the File .txt defined before ### 
g=`cat ${AA}.txt | wc -l` 

### Number of time the loop has to make calculated with the number of using cores ### 
let h=($g/$nproc) 

### Loop using $h ### 
for i in ((i = 1; i <= ${h}; i++)); do 

### Loop to asign every core a process ### 
for j in ((j = 1; j <= ${nproc}; j++)); do 

command lines to process $file 

done 

### Wait for every started process to finish ### 
wait 

done 

Die Syntaxfehler ich erhalte, ist:

/var/spool/torque/mom_priv/jobs/1796866.SC: line 57: syntax error near unexpected token `(' 
/var/spool/torque/mom_priv/jobs/1796866.SC: line 57: `for i in ((i = 1; i <= h; i++)); do' 

Gibt es eine Möglichkeit die Schleifen für i und für j zu schreiben anders zu machen Syntax arbeiten ? Dank

+1

https://www.gnu.org/software/bash/manual/bashref.html#Looping-Constructs –

+4

entfernen Sie 'i in' und' j in' –

+2

Bitte versuchen Sie http://shellcheck.net/, bevor Sie fragen wir Menschen. – tripleee

Antwort

2

Die Syntax ist (zum Beispiel):

for ((i = 0; i < $h; i++)); do 

Während wir darüber sind:

for ((i = 1; i <= $h; i++)); do 

obwohl die meisten Menschen es so schreiben würde

g=`cat ${AA}.txt | wc -l` 

ist wahrscheinlich besser geschrieben als:

g=$(wc -l < "$AA.txt") 

Die $() Schreibweise ist einfacher zu lesen als `

Wir sparen ein Kind Prozess

immer Variablen zitieren, die Dateinamen enthalten, könnten sie eingebettete Leerzeichen enthalten.

+0

Keine Notwendigkeit, Subshells zu starten, um Zeilen in einer Datei zu zählen, bash macht das einfach mit eingebauten. Siehe meinen Kommentar zu der Frage für eine Möglichkeit, dies zu tun. – ghoti

+0

@ghoti: Ich stimme zu, aber die Frage war über "für" Schleifen, und es gibt Vorbehalte. 'readarray' war von bash 4 (welches das OP benutzt) verfügbar, aber mein Problem damit ist, dass wir keine Ahnung haben wie groß die Eingabedatei ist. Wenn es zu groß ist, könnte es Speicher oder (theoretisch) sogar die Begrenzung der Anzahl von Elementen in einem Array zerstören. Es ist eine Liste von Dateinamen, daher stimme ich zu, dass dies unwahrscheinlich ist. Angesichts der Erfahrung, die in der Frage gezeigt wird, ist es meiner Meinung nach wichtiger, die zu häufige "piped cat" -Praxis zu korrigieren. – cdarke