2016-06-17 4 views
2

Je souhaite tester si une vue d'espace libre existe et n'exécuter la commande remove que si elle existe. J'essaie de le faire à partir d'un script shell dans un environnement Linux 6.x. J'ai essayé de formater mes conditions à la fois en tant que doublure et en "full", mais je ne pense pas pouvoir le faire fonctionner. Que dois-je faire pour que les deux approches - un interligne et une syntaxe complète - fonctionnent?Utilisation de scripts shell pour supprimer la vue en clair si elle existe en utilisant une seule ligne si

Voici le code, dans son dernier état

#!/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 

Je préférerais un type en une ligne de solution, mais « si » déclaration sera également.

+0

Que diriez-vous: '" $ {ctdir}/cleartool "lsview" $ {nom_vue} ">/dev/null 2> & 1 && {" $ {ctdir} "/ cleartool rmview" $ {nom_vue} "; echo "vue supprimée"; } ' – bishop

+0

Je vais essayer ça. Si je veux ajouter une partie échouée en indiquant l'écho "Impossible de supprimer la vue", comment ferais-je cela? Aussi, si possible, pouvez-vous expliquer comment cela fonctionne? – adbdkb

+0

Remarque: pour supprimer réellement une vue, il est nécessaire d'effectuer un désenregistrement et de ne plus l'enregistrer: voir Nukeview dans http://stackoverflow.com/a/4319090/6309. – VonC

Répondre

1

fourni la commande suit la UNIX convention des codes de sortie, le général one-liner ressemble:

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

La liste suivante && spécifie ce qui doit exécuter lorsque la commande réussit (sorties avec 0), tandis que la liste suivante || spécifie ce qui doit être exécuté lorsque la commande échoue. Dans la liste, notez que toutes les commandes se terminent par un point-virgule, y compris le dernier.

Pour votre cas, cela ressemble à ça va marcher:

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

Voici un exemple de ce modèle en action, en utilisant les commandes standard:

$ 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

Merci encore. Dans votre réponse précédente, quel rôle a joué la partie '">/dev/null 2> & 1 "' dans l'évaluation du "si" – adbdkb

+0

@adbdkb à la fois stdout et stderr sont redirigés vers '/ dev/null', ce qui signifie ils sont ignorés. La commande 'lsview' est seulement appelée pour sa valeur de sortie. 0 (c'est-à-dire que la vue existe) signifie la deuxième partie après que '&&' soit exécuté. 1 (la vue n'existe pas) signifie que la seconde partie après '&& 'n'est pas * exécutée. – VonC

+0

'>/dev/null 2> & 1' sortie silencieuse et les erreurs. Cela prenait une liberté injustifiée, alors je l'ai supprimé dans cette version. J'ai toujours laissé les guillemets autour de '$ {ctdir}', au cas où ce chemin aurait un espace dedans. – bishop