2016-07-06 15 views
1

Probleme mit Befehlssubstitution in einem Shellskript. Ich habe dieses Skript zuvor auf einem anderen System verwendet, also bin ich mir nicht sicher, was hier vor sich geht. Scheint, egal wie ich die Befehle umschließe, um die Variable zu setzen, bekomme ich eine leere Variable. Ich habe viele verschiedene Möglichkeiten versucht, sie zu umschließen ($(), Backticks, Zitate). Wenn es hilft, versuche ich einen Array-Job einzureichen.Probleme mit Befehlsersetzung (Variable ist leer)

#!/bin/bash 
#BSUB -q shared 
#BSUB -W 23:55 
#BSUB -M 51200 
#BSUB -J windowCovR1 
#BSUB -R "span[hosts=1]" 

mem=$LSB_JOBINDEX 
sample=`head -n "$mem" bednames.txt | tail -1 | awk '{print $2}'` 
eval ${sample} 
echo ${sample} 

$mem richtig eingestellt wird, dann ist es etwas mit der sample Linie. Der Befehl echo druckt eine leere Zeile.

+0

[Ich versuche, einen Befehl in eine Variable zu setzen, aber die komplexen Fälle scheitern immer!] (Http://mywiki.wooledge.org/BashFAQ/050) – fedorqui

+0

Ich glaube nicht, dass das wirklich dieses Problem angeht ... das hat vorher für mich funktioniert (auf einem anderen System), also nicht sicher, was gerade passiert. – Ethan

+0

Vielleicht ist 'bednames.txt' leer? Ein besserer Weg, die Zeile 'N' aus der Datei zu bekommen, könnte' sample = $ sein (awk -vlineno = $ {mem} 'NR == lineno {print $ 2}' bednames.txt) '... – twalberg

Antwort

0

Warum würden Sie "Backticks" zufällig anstelle von anderen Zitaten ausprobieren? Hast du eine Ahnung was Backticks machen?

Wenn das Ergebnis der Substitution leer ist, liegt das an dem Wert der Variablen. Haben Sie versucht, den Befehl DEBUGGING, dessen Ausgabe diese Variable setzt, durch, oh, ich weiß vielleicht nicht, es am Terminal einzugeben?

-1

Ihr Befehl zum Zuweisen des Werts von Probe ist korrekt. Arbeiten für mich auch auf der Kommandozeile. Allerdings verwenden Sie das gleiche in Shell-Skript. Also für die versuchen, unter Verwendung von: -

Probe = head -n "$mem" bednames.txt | tail -1 | awk '{print \$2}'

\ vor 2 $. Es kann vorkommen, dass das Skript nach dem zweiten Befehlszeilenargument sucht, wenn Sie ohne \ verwenden.

+0

In einfachen Anführungszeichen müssen Sie das '$' nicht umgehen, und tatsächlich wird sich 'awk' über einen Syntaxfehler beschweren. – twalberg

0

Da Sie $LSB_JOBINDEX verwenden, möchten Sie wahrscheinlich einen Array-Job. Der Jobname sollte die Start- und Endparameter des Arrays enthalten. Dieses Beispiel

#BSUB -J windowCovR1[1-100] 

davon ausgehen, dass es 100 Befehlszeilen in der Datei bednames.txt. Ohne die Array-Grenzen ist $LSB_JOBINDEX immer Null. head -n 0 wird leere Zeichenfolge geben.

Ich habe dieses einfache Beispiel versucht und es funktioniert in Ordnung für mich.

[[email protected] ~]$ cat tmp.sh 
#!/bin/bash 
#BSUB -q normal 
#BSUB -W 23:55 
#BSUB -M 10 
#BSUB -J windowCovR1[1-2] 
#BSUB -R "span[hosts=1]" 

mem=$LSB_JOBINDEX 
echo "$$ mem $mem" >> /tmp/LOG 
sample=`head -n "$mem" bednames.txt | tail -1 | awk '{print $2}'` 
echo "$$ ${sample}" >> /tmp/LOG 

[[email protected] ~]$ cat bednames.txt 
line11 line12 
line21 line22 

[[email protected] ~]$ bsub < tmp.sh 
Job <805> is submitted to queue <normal>. 

[[email protected] ~]$ cat /tmp/LOG 
7979 mem 1 
7979 line12 
7991 mem 2 
7991 line22 

Ein weiterer kleiner Punkt. Wenn dies kein paralleler Job ist, wird -R "span[hosts=1]" nicht benötigt.