2016-08-05 6 views
1

Ich muss Reihe von Befehlen in einem interaktiven Programm/Dienstprogramm mit parametrisierten Werten ausführen. Gibt es eine Möglichkeit, innerhalb von Heredoc zu loopen? Wie unten .. Nicht sicher, ob eval hier helfen kann. Das folgende Beispiel scheint nicht zu funktionieren, da das interaktive System Befehle nicht zu erkennen scheint.Schleife in "heredoc" in Shell-Skripting

#!/bin/sh 
list="OBJECT1 OBJECT2 OBJECT3" 
utilityExecutable << EOF 
for i in $list ; do 
utilityCommand $i 
done 
EOF 
+2

Nun, ein Heredoc könnte eine Subshell sein. Das könnte funktionieren, aber normalerweise, was Sie wollen, wird nicht funktionieren (wie ich denke, Sie haben entdeckt). Da dein Beispiel theoretisch ist, kann ich nur antworten, dass es theoretisch möglich ist, deinen Code wiederherzustellen, so dass die for-Schleife außerhalb ist, "eingepackt" "utilityExecutable". Verwenden Sie echte Befehle in Ihrem Q, und es wird einfacher zu helfen sein. Viel Glück. – shellter

+0

Ich denke, du musst besser erklären, was du zu tun versuchst. Möchten Sie eine Reihe von Eingabezeilen an 'utilityExecutable' senden? – rici

+0

@rici, ja Ich muss eine Reihe von Befehlen innerhalb der UtilityExecutable senden/ausführen, ohne das Dienstprogramm zu beenden, bis alle Befehle beendet sind. ist das mit heredoc noch möglich? – Kevin

Antwort

2

Statt ein hier-Dokument utilityExecutable zugeben, das Äquivalent ist der erforderliche Text, um ihn zu Rohr.

#!/bin/sh 

list="OBJECT1 OBJECT2 OBJECT3" 

for i in $list; do 
    echo "utilityCommand $i" 
done | utilityExecutable 
+1

Ausgezeichnet !! Funktioniert genau so, wie ich gesucht habe. Danke!! – Kevin

0

Ja, das heikel ist und kann verwirrend sein: Sie können den gewünschten Text mit echo Anweisungen in einer for-Schleife und Rohr die gesamte Schleife Ausgang utilityExecutable erstellen! Sie müssen Ihre Codes wie folgt ändern.

#!/bin/sh 
list="OBJECT1 OBJECT2 OBJECT3" 
utilityExecutable << EOF 
    list="$list" 
    for i in \$list ; do 
    utilityCommand \$i 
    done 
EOF 

Dies ist, weil heredoc seine eigenen Variablen verwendet, die vollständig von der Shell getrennt sind. Wenn Sie innerhalb von heredoc sind, müssen Sie die eigenen Variablen von heredoc verwenden und ändern. Also wird das \ $ benötigt, um innerhalb von heredoc auf die eigenen Variablen von heredoc anstatt auf Shell-Variablen zu verweisen.

Verwandte Themen