à quel propos ?Citation:
Envoyé par al1_24
ça affiche «ko», puisque "" ne commence pas par "b" !
c'est le cas "*" qui est traité, c'est à dire tous les cas qui ne sont pas explicitement donnés.
Version imprimable
à quel propos ?Citation:
Envoyé par al1_24
ça affiche «ko», puisque "" ne commence pas par "b" !
c'est le cas "*" qui est traité, c'est à dire tous les cas qui ne sont pas explicitement donnés.
Ben... j'insiste...
Chez moi, le case plante et ne passe dans aucune clause:
bon... j'avoue... je l'ai peut-être un peu cherché...Code:
1
2
3
4 $ unset var $ set -o nounset $ case $var in b*) echo ok;; *) echo ko; esac -bash: var: unbound variable
Cependant lorsque j'écris un script, j'essaie de prendre en compte l'éventualité que l'utilisateur a pu positionner l'option nounset!
C'est dans ce contexte que j'ai proposé:
Code:
1
2
3
4 $ unset var $ set -o nounset $ case ${var:-E} in b*) echo ok;; E) echo "var est E ou vide ou unset";; *) echo ko; esac var est E ou vide ou unset
ah, bah oui, avec nounset, t'as même pas le droit de respirer : «ERR: vos poumons sont vides. Exterminer ! Exterminer ! ...» :(
:mouarf:
de mon côté, je préfère traiter l'éventualité d'une variable vide, que de me faire éjecter par le shell.
mais, ce n'était, je crois, pas le propos d'al1_24.
J'étais en effet persuadé d'avoir déjà rencontré des problèmes avec case en testant une variable initialisée à vide.
Mais je ne sais plus sous quel environnement. Et je n'arrive pas à le reproduire avec le peu que j'ai sous la main maintenant (cygwin et pdksh :aie:).
Désolé d'avoir été insistant dans mon erreur;. :oops::oops::oops::facepalm:
J'adore l'image!!! :bravo:
C'est vrai qu'avec l'option nounset, ça me donne l'impression, sinon de ne pouvoir respirer, du moins qu'on va éclater au moindre toussotement! :pastaper:
Ben, moi aussi. Mais, lorsque je teste une variable, j'aime bien aussi prendre en compte le cas où elle est non positionnée.Citation:
de mon côté, je préfère traiter l'éventualité d'une variable vide, que de me faire éjecter par le shell.
Il existe quelques rares cas où ce n'est pas normal (par exemple, parce que c'est un sous-shell dont l'appelant avait comme obligation de positionner la variable au préalable).
Dans ce cas, je le teste spécifiquement (en précondition du sous-shell) avec, par exemple, test -z "${var-x}" et je fais un exit avec un message clair et net.
Mais, très souvent, voire la plupart du temps, soit la variable ne peut pas être non positionnée (car positionnée plus tôt dans le script), soit le comportement attendu est le même que la variable soit unset ou vide.
Dans ce cas, un simple test -z "${var:-}" ou bien case "${var:-}" in '') echo 'vide';; *) echo 'autre'; esac suffit pour même gérer l'éventualité de l'option nounset positionnée.
Je préfère donc ces tests aux habituels test -z "${var}" ou case "${var}" in '') echo 'vide';; *) echo 'autre'; esac (du moins, lorsque l'option chipotage est on :mouarf:).
[HS]Depuis quelque temps déjà, on peut avantageusement remplacer la balise [codeinline] par la balise [c] (c'est rigolo à formater, ça! :D).[/HS]
J'ai testé ta manière de faire (ça fonctionne, enfin ça à l'air de fonctionner) et je ne savais pas que "${status:-E}" = 'E' permettait de vérifié tout ce que tu as énuméré !!!!! Les accolades :calim2:
Et moi je n'ai pas utilisé le case j'ai l'aissé mes if elif ......:D ais-je tord de le faire ?
Merci d'avance
"test" est une instruction équivalente à "[", la seule différence est qu'elle ne demande pas de délimiteur de fin "]".
La ligne:
est la même chose que :Code:until test -z "$status" -o "$status" = "E"
qui est plus habituel comme syntaxe.Code:while [ -n "$status" -a "$status" != "E" ]
Le case est équivalent au if+elif.
Personnellement, je préfère utiliser le case chaque fois que c'est possible car je le trouve plus clair au premier coup d'oeil.
Avec un test du genre "si a = 3 alors... sinon si a > 3 alors... sinon si b = 2 alors... sinon... fin si", on ne peut pas utiliser le case, donc on utilise le if+elif.
Avec un test du genre "suivant la valeur de $status, qui peut être égale à soit 'Q' soit 'R' soit 'E'...", c'est le cas typique d'utilisation du case, qui me paraît donc préférable.
[chipotage-HS]Sinon, je dirais que tu as tort d'avoir tord...
Il se tord de douleur quand quelqu'un dit avoir tord...
N'oublions pas que le tort t' tue. (mnémotechnique)
;)
[/chipotage-HS]
case est plus lisible, à mes yeux.Citation:
Envoyé par jack-ft
Merci à tous pour vos interventions.
J'ai pu avancer dans mon code.
Re,
Je relance ce sujet car en fait il n'est pas tout à fait résolu :weird:
Je viens de me rendre compte que lorsque mon statut sous linux via qstat passe en E (ce qui traduit que le job est terminé) la boucle until (j'ai testé avec l'équivalent en while) continue de tourner, alors qu'elle devrait se terminer. En fait la boucle se termine seulement lorsque $STATUS ne vaut rien.
donc juste pour rappel, j'ai peut être mal exprimé mon problème :
$STATUS renvoie le statut d'un job qui peut valoir Q,R,E et éventuellement rien, je récupère l'état de ce statut dans ma variable $STATUS.
Si $STATUS = "Q" la boucle doit continuer
Si $STATUS = "R" la boucle doit continuer
Si $STATUS = "E" la boucle doit s'arrêter et l'utilisateur doit pouvoir reprendre la main.
Cas rare mais qui peux arriver :
$STATUS = "" (elle ne vaut rien) dans ce cas la boucle se termine et l'utilisateur reprend la main. Apparement ce dernier cas est traité avec le code. Ce qui cause problème c'est le cas où $STATUS="E"
Voici le code :
Une idée ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 function status { until test "${STATUS:-E}" = 'E' do STATUS=$(qstat | grep "$ID_JOB.master" | awk '{print $5}') if [ "$STATUS" = "Q" ] then STATUS="Waiting ..." elif [ "$STATUS" = "R" ] then STATUS="Running ..." elif [ "$STATUS" = "E" ] then STATUS="Finished !" fi printf "\rStatus job $ID_JOB : $STATUS" done STATUS="Finnished !" printf "\rStatus job $ID_JOB : $STATUS" printf "\n"
A l'intérieur de ta boucle, quand tu reçois E de ton job, tu le remplaces par Finished ce qui fait que le test "${STATUS:-E}" = 'E' n'est jamais vérifié
C'est parce que tu utilises la même variable pour deux choses différentes ; d'une part la lettre du Statut retourné par ton job, d'autre part le message que tu veux afficher.
En les séparant, tu auras tout de suite un meilleur résultat :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 function status { until test "${STATUS_LTR:-E}" = 'E' do STATUS_LTR=$(qstat | grep "$ID_JOB.master" | awk '{print $5}') if [ "$STATUS_LTR" = "Q" ] then STATUS_MSG="Waiting ..." elif [ "$STATUS_LTR" = "R" ] then STATUS_MSG="Running ..." elif [ "$STATUS_LTR" = "E" ] then STATUS_MSG="Finished !" fi printf "\rStatus job $ID_JOB : $STATUS_MSG" done STATUS_MSG="Finished !" printf "\rStatus job $ID_JOB : $STATUS_MSG" printf "\n"
:plusser:
Et, avec le "case" (pff... faut lui faire tout le boulot):
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 function status() { until test "${STATUS_LTR:-E}" = 'E' do STATUS_LTR=$(qstat | grep "$ID_JOB.master" | awk '{print $5}') case "$STATUS_LTR" in Q) STATUS_MSG="Waiting..." ;; R) STATUS_MSG="Running..." ;; E) STATUS_MSG="Finished !" ;; *) STATUS_MSG="Unknown !" esac printf "\rStatus job $ID_JOB : $STATUS_MSG" done STATUS_MSG="Finished !" printf "\rStatus job $ID_JOB : $STATUS_MSG" printf "\n" }