2010-12-30 9 views
0

Ich schreibe ein Bash-Skript, das unter vielen anderen Dingen verwendet, erwarten, dass automatisch eine Binärdatei ausgeführt wird und installieren Sie es durch Beantworten von Anweisungen des Installationsprogramms.Wie bette ich ein Expect-Skript ein, das Argumente in ein Bash-Shell-Skript aufnimmt?

Ich konnte mein expect-Skript in Ordnung bringen, wenn das expect-Skript in meinem Bash-Skript mit dem Befehl "expect $ expensescriptname $ Parameter" aufgerufen wird. Ich möchte jedoch das expect-Skript in das Shell-Skript einbetten, anstatt zwei separate Skriptdateien für den Job verwalten zu müssen. Ich suchte herum und fand, dass das Verfahren in Bash-Skript einzubetten erwarten war unten eine Variable wie VAR zu erklären und Echo dann .:

VAR=$(expect -c " 
#content of expect script here 
") 
echo "$VAR" 

1) Ich verstehe nicht, wie Echo tatsächlich $ VAR läuft das erwarten Skript. Könnte jemand erklären?
2) Ich bin mir nicht sicher, wie $ Parameter an VAR oder an die Echo-Anweisung übergeben wird. Das ist meine Hauptsorge.

Irgendwelche Ideen? Vielen Dank.

Antwort

2

In bash, das Konstrukt $(cmd) führt den angegebenen Befehl und erfasst seine Ausgabe. Es ist ähnlich wie die Backtick-Notation, obwohl es einige kleine Unterschiede gibt. Somit ist die Zuordnung zu VAR, was die läuft erwarten Befehl:

# expect is run here 
VAR=$(expect -c " 
# ... 
") 

# This echoes the output of the expect command. 
echo "$VAR" 

Von bash Handbuch Seite:

Wenn die alten Stil Backquote Form der Substitution verwendet wird , Backslash behält seine wörtliche Bedeutung mit Ausnahme von , gefolgt von $, , or \. The first backquote not preceded by a backslash terminates the command substitution. When using the $ (Befehl) `Form, alle Zeichen zwischen den Klammern mak e den Befehl; keine werden speziell behandelt.

Das ist, warum es funktioniert: Der bash Kommentarzeichen (#) wird nicht als Kommentar Charakter im $(...) behandelt.

EDIT

Geben von Parametern: ‚em Genau dort. Betrachten wir zum Beispiel das Skript:

foo="Hello, there" 
bar=$(echo " 
# $foo 
") 
echo $bar 

Wenn Sie das Skript ausführen, druckt es:

# Hello, there 

Somit wird der Wert von $foo innerhalb der Anführungszeichen ersetzt wurde. Dasselbe sollte für das Skript expect funktionieren.

+0

Ok. Wusste diese Alternative zur Backtick-Notation nicht. – fzkl

+0

Danke. Irgendwelche Ideen zum Übergeben von Parametern aus der Shell zu erwarten? – fzkl

+0

Siehe meine Bearbeitung , über. –

2

Versuchen Sie so etwas wie:

#!/bin/sh 

tclsh <<EOF 
puts $1 
EOF 

Ich habe nicht den Befehl installiert heute erwarten, so habe ich tclsh statt.

1

Anstatt ein bash-Skript und ein expect-Skript, haben Sie überlegt, nur ein einziges expect-Skript zu schreiben?

Expect ist eine Obermenge von Tcl, was bedeutet, dass es eine voll funktionsfähige Programmiersprache ist, und Sie können alles damit machen, was Sie mit bash machen können (und für die Dinge, die Sie nicht können, können Sie bash immer ausführen) Sie müssen nicht erwarten, nur zu "erwarten" Dinge

Verwandte Themen