Travail terminé, corrections

fais ton choix :wink: :

# 1
fdisk /dev/sdb <<< q &>/dev/null && echo "device /dev/sdb ok" || echo "device /dev/sdb ko" # nécessite d'être root
# 2 - si tu utilises udev
udevadm --query=name --name=/dev/sdb &>/dev/null && echo "device /dev/sdb ok" || echo "device /dev/sdb ko"
# 3 - full bash (attention, les parenthèses sont importantes car l'utilisation de shopt effectue une modification de l'environnement d'exécution)
( shopt -s nullglob; devices=( /dev/sdb* ); [[ "${devices[@]}" ]] ) && echo "device /dev/sdb ok" || echo "device /dev/sdb ko"
# version avec les if 
if ( shopt -s nullglob; devices=( /dev/sdb* ); [[ "${devices[@]}" ]] )
then
   echo "device /dev/sdb ok"
else
   echo "device /dev/sdb ko"
fi

J’ai encore modifié : c’est bon ce qui suit :

[code]ddext=’/dev/sdb9’
ddext2=’/dev/sdb10’
autre=’/mnt/autre’

if [ ! -e $ddext ] || [ ! -e $ddext2 ]
then
echo "Le DDext ne répond pas"
else
[ -d $autre ] || echo "Le dossier de montage n’existe pas !"
read -p 'sauve ou sauve2 ? : ’ part
if [ $part = sauve ]
then
sudo mount -t ext3 $ddext $autre
elif [ $part = sauve2 ]
then
sudo mount -t ext2 $ddext2 $autre
else
echo "mauvaise entree"
fi
fi[/code]

Bonjour,
Plutôt que d’avertir de la non-existence du dossier, je le créerais directement.

1/ Oui mais ça ne va pas faire une réponse supplémentaire, du genre : “ne peut pas créer,le dossier existe déjà” ?
2/ J’ai déjà modifié pas mal de choses en fonction des précédentes réponses, que je proposerai après mais j’ai besoin encore d’une aide :
comment mettre la sortie sur la même ligne ?

then echo "Le dossier de montage n'existe pas !" exit

Non.
Si le dossier existe, la partie derrière le “||” ( ou ) ne sera jamais éxecutée.

Le premier test est inutile, l’option -p suffit.

@ricardo >

Tu devrais quand même lui donner un code d’erreur (“exit 1” par exemple).

Si je comprends bien, cette commande ne nécessite rien d'autre puisque :
si '$autre' (le dossier de montage) existe, il passe à la suite
si '$autre' n'existe pas, il le crée
problème : pour créer un dossier, il faut être root, alors que va-t-il faire ?

Si je comprends bien, cette commande ne nécessite rien d’autre puisque :
si ‘$autre’ (le dossier de montage) existe, il passe à la suite
si ‘$autre’ n’existe pas, il le crée
problème : pour créer un dossier, il faut être root, alors que va-t-il faire ?

[quote=“ricardo”]mkdir -p $autre
Si je comprends bien, cette commande ne nécessite rien d’autre puisque :
si ‘$autre’ (le dossier de montage) existe, il passe à la suite
si ‘$autre’ n’existe pas, il le crée
problème : pour créer un dossier, il faut être root, alors que va-t-il faire ?[/quote]
Te balancer une erreur comme quoi il n’a pas les droits suffisants.

Conseil : protège la variable avec des double guillemets :

Comme ça si autre contient un espace, il créeras un dossier avec un espace dedans et pas deux dossiers.

Et pour l’histoire (au sujet de mon dernier conseil), un patch qui a fait le tour de monde il n’y a pas très longtemps était celui-ci :

[code]- rm -rf /usr /lib/nvidia-current/xorg/xorg

  • rm -rf /usr/lib/nvidia-current/xorg/xorg[/code]

Une faute de frappe Tu peut voir le commit ici :
github.com/MrMEEE/bumblebee/com … cdbe0acce6

L’utilisation d’une variable et la protection par les guillemets permet d’obtenir un message d’erreur plutôt que de détruire la distribution.

jolie la boulette ! :038

[quote=“MisterFreez”]Et pour l’histoire (au sujet de mon dernier conseil), un patch qui a fait le tour de monde il n’y a pas très longtemps était celui-ci :

[code]- rm -rf /usr /lib/nvidia-current/xorg/xorg

  • rm -rf /usr/lib/nvidia-current/xorg/xorg[/code]

Une faute de frappe Tu peut voir le commit ici :
github.com/MrMEEE/bumblebee/com … cdbe0acce6

L’utilisation d’une variable et la protection par les guillemets permet d’obtenir un message d’erreur plutôt que de détruire la distribution.[/quote]

Mais en fait, qu’est-ce qui empêche de n’utiliser QUE les guillemets ?
Y-a-t-il des cas ou les '…'soient indispensables ?

[quote=“MisterFreez”]@ricardo >

Oui mais la ligne est plus longue que ça.
Je voudrais savoir si et comment on peut faire que le ‘&&’ ne soit pris en compte que pour ce qui est après le ‘||’ et non avant.
ligne complète :

Autrement dit, si $variable est présent, que ça ne sorte PAS.

Bonjour,

Cette syntaxe n’executera le exit 1 que si la variable n’existe pas :

J’y avait pensé mais j’ai testé avec les crochets et je n’ai pas insisté, quelle burne :unamused:
Merci.

[quote=“micky979”]Bonjour,

Cette syntaxe n’executera le exit 1 que si la variable n’existe pas :

[ -e "$variable" ] || ( echo "Le dossier de montage n'existe pas " && exit 1 )

Ben non, si la variable n’est pas bonne, il continue sans sortir (copié/collé) :

[ -e "$variable" ] || ( echo "Le dossier de montage n'existe pas !" && exit 1 )

:013 :013 :013

idem sans code de sortie ou avec 64

Bonjour,

Je n’y ai pas pensé mais c’est le sous-shell qui va etre quitté avec un exit 1 :

[code][ -e “$variable” ] || ( echo “Le dossier de montage n’existe pas” && exit 1 )

  • ‘[’ -e ‘’ ‘]’
  • echo ‘Le dossier de montage n’’'existe pas’
    Le dossier de montage n’existe pas
  • exit 1
    ~$ echo $?
    echo $?
  • echo 1
    1[/code]

Voici une autre syntaxe qui devrait fonctionner en utilisant que les && :

[quote=“ricardo”]
Je voudrais savoir si et comment on peut faire que le ‘&&’ ne soit pris en compte que pour ce qui est après le ‘||’ et non avant.
ligne complète :

Autrement dit, si $variable est présent, que ça ne sorte PAS.[/quote]

Il faut que tu inclus tes 2 instructions dans un bloc et dans le même contexte. Un bloc se constitue avec des accolades :

[ -e "$variable" ] || {
  echo "Le dossier de montage n'existe pas !" 
  exit 1
}

si l’accolade de fin se trouve sur une ligne avec instruction, il faut que la dernière instruction soit suivie d’un point-virgule :

[ -e "$variable" ] || { echo "Le dossier de montage n'existe pas !"; exit 1; }

Les parenthèses peuvent également être utilisées pour créer un bloc. Cependant, elles crées également un processus fils. L’emploi d’un exit dans un processus fils permet de quitter le processus fils et non le processus père. Ce n’est donc pas ce que tu souhaites.
A l’inverse des accolades, le point-virgule en fin de bloc n’est pas nécessaire.

edit : aussi, il est d’habitude d’envoyer les messages d’erreur sur la sortie…d’erreur !

[ -e "$variable" ] || { echo "Le dossier de montage n'existe pas !" >&2; exit 1; }
# ou bien 
[ -e "$variable" ] || { echo "Le dossier de montage n'existe pas !"; exit 1; } >&2

Merci à vous deux :006
Totor, tu as devancé la question que je voulais poser ensuite avec la façon d’ajouter le retour de code d’erreur :023
Mais j’ai encore deux questions sur le domaine des codes.
1/ quand plusieurs ‘exit’ sur un script, doit-on changer le code à chaque ‘exit’ ?
et celui de “fin”, comment le rédiger ?

2/ J’ai lu dans le lien qui suit, qu’il serait préférable d’employer les code d’erreur perso entre 64 et 113. Qu’en pensez-vous ?
http://abs.traduc.org/abs-fr/apd.html#exitcodesref

EDIT :
explication de “>&2”
Je comprends que ça permet avec un echo $? de connaître le code d’erreur.
Mais le “plus grand que” “et deux” ???

Re,

1/ Non, tu n’es pas obligé. Il est bon regrouper ses codes erreur par “type” : technique en rapport avec des accès disques, erreur technique en rapport avec le réseau …etc (mais également fonctionnel) Ensuite, le message est là pour apporter des précisions et orienter l’utilisateur.

Pour celui de fin, il n’est pas nécessaire. S’il n’existe pas, le statut ne vaut pas forcément 0 mais vaut celui de la dernière instruction exécutée (Contrairement à ce que beaucoup de développeurs pensent).

2/ Je ne connaissais pas cette classification et j’avoue que j’ai tendance à utiliser mes propres statuts.

Explication :

  • le 2 est le n° du descripteur de fichier (fd) de la sortie d’erreur (dont le fichier associé est /dev/stderr)
  • le signe “>” indique une redirection de flux. Par défaut, on redirige la sortie standard. Mais l’on peut préciser le flux à rediriger
    exemple : 2>&1 où là on fait l’inverse : on redirige la sortie d’erreur vers la sortie standard (fd de la sortie standard=1).
  • le & préciser que l’on redirige vers un fd. Si le & est absent, on redirige vers un fichier…

il existe 3 fd par défaut :
0 - entrée standard
1 - sortie standard
2 - sortie d’erreur

pour plus de précisions : abs.traduc.org/abs-fr/ch19.html
(car il y a beaucoup de variantes et c’est quelque peu complexe)

Non, tes explications me suffisent, je n’ai pas l’intention de devenir prof d’info à mon âge :smiley: Mais j’aime bien comprendre un minimum ce que je fais.
Merci.
Y’en aura certainement d’autres :wink: