2009-05-20 5 views
4

Ich bin relativ neu in Unix-Shell-Skripten. Hier ist mein Problem. Ich habe dieses Skript ...So extrahieren Sie eine Teilzeichenfolge, die mit einem Muster aus einer Unix-Shell-Variablen übereinstimmt

isql -S$server -D$database -U$userID -P$password <<EOF> $test 
exec MY_STORED_PROC 
go 
EOF 

echo $test 

dieses Ergebnis zu erzeugen ...

Msg 257, Level 16, State 1: 
Server 'MY_SERVER', Procedure 'MY_STORED_PROC': 
Implicit conversion from datatype 'VARCHAR' to 'NUMERIC' is not allowed. Use 
the CONVERT function to run this query. 
(1 row affected) 
(return status = 257) 

Statt die isql Ausgabe von Echo, ich möchte die „257“ extrahieren und kleben Sie es in eine andere Variable, so kann ich 257 aus dem Skript zurückgeben. Ich denke, eine Art sed oder grep Befehl wird dies tun, aber ich weiß nicht wirklich wo ich anfangen soll.

Irgendwelche Vorschläge?

Antwort

14

bash können Teile aus dem Inhalt der Shell-Variablen abzustreifen.

${parameter#pattern} gibt den Wert von $ parameter ohne den Teil am Anfang zurück, der pattern entspricht.

${parameter%pattern} gibt den Wert von $ parameter ohne das Teil am Ende zurück, das mit pattern übereinstimmt.

Ich denke, es gibt einen besseren Weg, dies zu tun, aber das sollte funktionieren. So könnte man dies in kombinieren:

% strip the part before the value: 
test=${test#Msg } 
% strip the part after the value: 
test=${test%, Level*} 
echo $test 

Wenn Sie im (return status = xxx) Teil interessiert sind, es wäre:

result=${test#*(result status = } 
result=${result%)*} 
echo $result 

Der entsprechende Abschnitt der bash manpage ist "Parameter Expansion".

2

Hier ist ein quick and dirty Hack für Sie, wenn Sie sich wirklich das Zeug zu lernen beginnen sollte:

 
RC=`tail -1 $test |sed 's/(return status = \([0-9]\+\))/\1/'` 
+0

Danke. Deshalb frage ich: Ich wollte erfahrene Unix-Programmierer sehen, die ein echtes Problem lösen würden, damit ich lernen konnte, es selbst zu tun. In diesem Fall leitet der Befehl tail die letzte Zeile von $ test an den Befehl sed, der den Inhalt von \\ (und) zurückgibt (vorausgesetzt, das Gesamtmuster stimmt überein). Ist das richtig? –

+0

Ja, was auch immer zwischen dem \\ (und \\) ist, wird dann durch \ 1 in der Ersetzung angegeben. [0-9] \ + bedeutet, dass eine oder mehrere Ziffern übereinstimmen. –

Verwandte Themen