2016-06-17 3 views
2

Ich möchte testen, ob eine Clearcase-Ansicht existiert, und den remove-Befehl nur ausführen, wenn er existiert. Ich versuche es mit einem Shell-Skript in einer Linux 6.x-Umgebung. Ich habe versucht, meine Bedingungen sowohl als One-Liner als auch als vollständige "if" -Anweisung zu formatieren, aber ich scheine nicht in der Lage zu sein, es zum Laufen zu bringen. Was muss ich tun, damit beides - One-Liner und Full-If-Syntax - funktioniert?Shell-Skripts verwenden, um die Clearcase-Ansicht zu entfernen, wenn sie mit einem Liner existiert, wenn

Hier ist der Code, in seinem neuesten Stand

#!/bin/ksh 
# 
STREAMNAME=app_stream_int 
PVOB=domain_pvob 
VOB=domain_app 

viewdir=/opt/local/software/rational/viewstorage 
shareddir=/opt/shared/test 
storagedir=${shareddir}/viewstorage 
projectdir=${shareddir}/projects 

ctdir=/opt/rational/clearcase/bin 
viewname=$viewdir/test_$STREAMNAME.vws 
viewtag=test_$STREAMNAME 

echo "STREAMNAME $STREAMNAME - PVOB $PVOB - VOB $VOB" 
echo "Removing View if it exists ... \n" 

# [ $(${ctdir}/cleartool lsview ${viewname}) ] && { ${ctdir}/cleartool rmview ${viewname}; echo "view removed" } 

# [ ${ctdir}/cleartool lsview -long ${viewtag} ] && { ${ctdir}/cleartool rmview ${viewname}; echo "view removed" } 

# ${ctdir}/cleartool lsview -long ${viewtag} | grep "Tag" && { ${ctdir}/cleartool rmview ${viewname}; echo "view removed" } 

if [ ${ctdir}/cleartool lsview -long ${viewtag} | grep 'Tag' == "0" ] 
then 
    echo "view found" 
    ${ctdir}/cleartool rmview ${viewname} 
fi 

Ich würde es vorziehen, eine Einzeiler Art der Lösung, aber ‚wenn‘ Aussage wird auch funktionieren.

+0

Wie etwa: '" $ {ctdir}/cleartool "lsview" $ {viewname} ">/dev/null 2> & 1 && {" $ {ctdir} "/ cleartool rmview" $ {viewname} "; Echo "Ansicht entfernt"; } ' – bishop

+0

Ich werde das versuchen. Wenn ich einen Fail-Teil hinzufügen möchte, der das Echo "Ansicht nicht entfernen" anzeigt, wie würde ich das tun? Kannst du, wenn möglich, auch erklären, wie das funktioniert? – adbdkb

+0

Hinweis: Um eine Ansicht wirklich zu entfernen, müssen Sie die Markierung aufheben und die Registrierung aufheben: siehe nukeview in http://stackoverflow.com/a/4319090/6309. – VonC

Antwort

1

den Befehl bereitgestellt folgt dem UNIX-Konvention von Exit-Codes, sieht die allgemeine Einzeiler wie:

command && { success1; success2; } || { failure1; failure2; } 

Die Liste folgende && gibt an, welche ausgeführt werden soll, wenn der Befehl (Ausfahrten mit 0) erfolgreich ist, während die Liste nach || angibt, was ausgeführt werden soll, wenn der Befehl fehlschlägt. Beachten Sie in der Liste, dass alle Befehle in einem Semikolon enden, einschließlich des letzten.

Für Ihren speziellen Fall, das sieht aus wie es funktionieren wird:

"${ctdir}"/cleartool lsview "${viewname}" && { "${ctdir}"/cleartool rmview "${viewname}" && echo "view removed" || echo "cannot remove view"; } 

Hier ist ein Beispiel für dieses Muster in Aktion, unter Verwendung von Standard-Befehlen:

$ ls foo && { rm -f foo && echo 'removed' || echo 'not removed'; } 
ls: cannot access foo: No such file or directory 

$ touch foo 
$ ls foo && { rm -f foo && echo 'removed' || echo 'not removed'; } 
foo 
removed 

$ sudo touch /foo 
$ sudo chmod 600 /foo 
$ ls /foo && { rm -f /foo && echo 'removed' || echo 'not removed'; } 
/foo 
rm: cannot remove ‘/foo’: Permission denied 
not removed 
+0

Danke nochmal. In Ihrer früheren Antwort, welche Rolle hat der Teil, der '">/dev/null 2> & 1 "spielt, bei der Auswertung des" if " – adbdkb

+0

@adbdkb sowohl stdout als auch stderr wird umgeleitet nach'/dev/null', was bedeutet Sie werden ignoriert. Der Befehl 'lsview' wird nur für seinen Exit-Wert aufgerufen. 0 (dh die Ansicht existiert) bedeutet den zweiten Teil nach dem '&&' ausgeführt wird. 1 (die Ansicht existiert nicht) bedeutet, dass der zweite Teil nach '&&' * nicht * ausgeführt wird. – VonC

+0

'>/dev/null 2> & 1' stumm geschaltete Ausgabe und Fehler. Das war eine ungerechtfertigte Freiheit, also entfernte ich es in dieser Version. Ich habe immer noch die Anführungszeichen um '$ {ctdir}' gelassen, falls dieser Pfad jemals ein Leerzeichen enthält. – bishop

Verwandte Themen