2016-07-07 7 views
0

schreibt habe ich ein Skript, das wie etwas ist:Skript, das mehrere Skripte in Bash

for k in {1..100..1} 
do 
cat <<EOF> script${k}.sh 

    do some things 

    cat <<EOF> somefile 
    text 
    EOF 

    do some things 


EOF 
done 

Also, kurz gesagt, ich will 100-Skripte, die wie folgt aussieht:

do some things 

    cat <<EOF> somefile 
    text 
    EOF 

    do some things 

Das Problem ist, dass Wenn ich das ausführe, verbindet Bash das erste EOF mit dem dritten und hört auf zu schreiben, und es beginnt, die nächsten Befehle auszuführen.

Wie kann ich das beheben?

Vielen Dank im Voraus!

EDIT: Ich korrigiert Tippfehler unten von Aaron hingewiesen. Außerdem werde ich ein bisschen meine ursprüngliche Frage erweitern. Nach Aarons Angabe benutzte ich END für den ersten und letzten EOF. Es funktioniert gut, aber ich habe immer noch Probleme. Als spezifischere, sieht mein Code dies wie:

for k in {1..100..1} 
do 
cat <<END> script${k}.sh 

    mkdir folder${k} 
    cd folder${k} 

    cat <<EOF> somefile 
    text 
    EOF 

    for j in {1..80..1} 
    cat <<EOF> program${j} 
     text 
    EOF 

einige Sachen ausführen

END 
done 

Ich denke, man sich die Mühe zu sehen. Jetzt funktioniert der Code fast gut. Das Problem liegt bei den Variablen. Die $ {k}, die zwischen den ENDs liegen, werden in der script${k} nicht korrigiert durch die entsprechende Zahl ersetzt!

Vielen Dank für all die Hilfe :-)

+2

Sie können EOF nicht einrücken, es wird nicht erkannt. – choroba

+0

Danke. Ich habe es nicht eingezogen. Ich habe es gerade so hier in der Post geschrieben, damit Sie es deutlicher lesen können – Qwertuy

Antwort

2

EOF jede Token sein, der am Ende des heredoc gefunden werden, so dass Sie ein anderes auf dem äußeren heredoc verwenden:

for k in {1..100..1} 
do 
cat <<END> script${1}.sh 
do some things 

cat <<EOF> somefile 
text 
EOF 

do some things 

END 
done 

Ein paar zusätzliche Hinweise:

  • Sie nicht $k verwenden, so dass Sie im Grunde die gleiche Datei 100 mal überschrieben werden. Meinst du script${k}.sh anstatt script${1}.sh?

  • 100 Versionen des gleichen Skript erstellen scheint nutzlos, auch wenn das Verhalten des Skripts auf seinen Namen ab. Könnten Sie stattdessen Parameter an ein eindeutiges Skript übergeben?

+0

Danke für Ihre Antwort. Ja, ich meinte natürlich $ {k}, das war ein Tippfehler. Ich werde es jetzt korrigieren, danke. Außerdem ist jedes Skript natürlich anders. Ich habe gerade nicht die Details meines speziellen Codes geschrieben, da sie nicht relevant erschienen. – Qwertuy

+0

Auch wenn sie anders sind, fügen Sie eine Indirektion hinzu, die mir nutzlos erscheint. Anstatt die Skripte zu generieren und dann die eine auszuführen, die Sie benötigen, können Sie stattdessen das benötigte Skript an ein eindeutiges Skript übergeben, das sich wie das benötigte Skript verhält. – Aaron

+0

Aaron, ich möchte nicht nur einen von ihnen ausführen. Ich muss sie alle ausführen – Qwertuy