à quel propos ?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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ! ...»
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 ).
Désolé d'avoir été insistant dans mon erreur;. :facepalm:
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
J'adore l'image!!!
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!
Ben, moi aussi. Mais, lorsque je teste une variable, j'aime bien aussi prendre en compte le cas où elle est non positionnée.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 ).
[HS]Depuis quelque temps déjà, on peut avantageusement remplacer la balise [codeinline] par la balise [c] (c'est rigolo à formater, ça! ).[/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
Et moi je n'ai pas utilisé le case j'ai l'aissé mes if elif ...... 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 : Sélectionner tout - Visualiser dans une fenêtre à part until test -z "$status" -o "$status" = "E"
qui est plus habituel comme syntaxe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part while [ -n "$status" -a "$status" != "E" ]
ɹǝsn *sıɹɐlos*
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]
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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"
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Et, avec le "case" (pff... faut lui faire tout le boulot):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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" }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager