Bonjour
avez-vous une idée sur le pb
Pièce jointe 634351
Pièce jointe 634352
Version imprimable
Bonjour
avez-vous une idée sur le pb
Pièce jointe 634351
Pièce jointe 634352
- le titre de ton sujet doit être explicite.
- il est préférable, quand on poste du code, de ne pas envoyer des captures d'écrans, mais autant de copier/coller.
- en cherchant sur le net avant de poster (c'est demandé dans la charte du forum), tu aurais trouvé une solution au problème : il faut des espaces autour des crochets.
aux crochets, je préfère test qui dit bien ce qu'il fait, et "désolidarise" la commande du if, évitant ainsi toute confusion.
cd ~/quelquePart, donc tu sais où tu te déplaces, tu sais où tu es : y=`pwd` ne sert alors à rien.
d'une manière générale, dans un script, cd n'est pas utile.
test -f fichier, et ... ?
ah, oui ! a=$? :roll:
pourquoi pas tout de suite if test -f fichier (comme je le disais au début de mon message) ? :)
Il faut espacer les crochets de l'évaluation => if [ $a -eq 0 ] et non if [$a -eq 0]. Ou alors, comme le dit N_Bah, utiliser test qui est la commande d'origine => if test $a -eq 0.
A partir de là, ton script fonctionnera. Mais question finesse...:?
Aux remarques de N_BaH, qui bien évidemment gardent toutes leur pertinences, on peut rajouter celles-ci
- on ne teste pas si un état vaut 1 mais s'il est différent de 0 (parce qu'il peut valoir toute la gamme de 1 à 255, chaque valeur permettant d'indiquer un souci X ou Y)
- plutôt que de tester s'il vaut 1, puis re-tester s'il vaut 0, on testera plus intelligemment s'il est différent de 0 et sinon, c'est que le fichier existe (un seul test au lieu de deux)
- si tu rajoutes une instruction (style echo) entre le test et la récupération de l'état, tu récupères l'état de la dernière instruction et non plus celui du test. Donc il vaut mieux regrouper la commande et son état en une ligne => test -f resultat; status=$?
Mince, hier (oui oui, j'ai vraiment fait ça hier, à prendre au sens littéral) j'ai passé tous mes scripts et ai remplacé les "test" par des crochets.
Mais voici pourquoi
- j'ai remarqué que les scripts système (/etc/profile, .profile par défaut) utilisaient les crochets
- etant donné qu'il est sorti les doubles crochets [[ ... ]] permettant des tests avancés, cette syntaxe n'ayant pas d'équivalent littéral (enfin je crois), je me suis dit que désormais la syntaxe "crochets" devenait une syntaxe à plébisciter, permettant ainsi de changer plus facilement [ ... ] en [[ ... ]] et inversement si besoin (d'ailleurs justement la semaine dernière j'ai utilisé pour la première fois les doubles crochets afin de regarder si "$TERM" débutait par "xterm" => [[ $TERM = xterm* ]]
Mais bon, ça reste aus goûts de chacun. 8-)
Merci N_BaH
pour info, je suis débutant
voilà j'ai rectifié le script aussi, j'ai tapé la commande sur le terminal avant
mais j'ai toujours un problème
Pièce jointe 634358
ok ca marche merci le pb etait l'espace à la condition if
Pièce jointe 634359
test -f ne teste pas l'existence, mais le type. Donc si "resultat" est un lien symbolique, un pipe, un fichier spécial ou un dossier, le test renvoie faux bien qu'il existe. Pour tester l'existence pure c'est test -eCode:
1
2
3 #!/usr/bin/bash test -e "resultat" && echo "Le fichier resultat existe" || echo "Le fichier resultat n'existe pas" [ -e "resultat" ] && echo "Le fichier resultat existe" || echo "Le fichier resultat n'existe pas"
Pour les chaines, il vaut mieux en général utiliser les doubles quotes plutôt que les quotes simples car les doubles quotes conservent certaines propriétés intéressantes
Les simples quotes ont leur utilité aussi (par exemple quand justement on ne veut pas transformer le texte) mais pas ici.Code:
1
2
3 #!/usr/bin/bash echo 'Je me trouve dans $(pwd)' echo "Je me trouve dans $(pwd)"
oui, je sais sauf que je veux fair des essais des commandes suivants dans un script
donc le message n'explique pas la commande
test -e <nom_fichier> : vrai si l’argument existe
test -f <nom_fichier> : vrai si l’argument est un fichier ordinaire
test -d <nom_fichier> : vrai si l’argument est un répertoire
test -L <nom_fichier> : vrai si l’argument est un lien symbolique
test -r <nom_fichier> : vrai si on a le droit de lire le fichier
test -x <nom_ficher> : vrai si on a le droit d’exécuter le fichier
test -w <nom_ficher> : vrai si on a le droit d’écrire dans le fichier
test -s <nom_fichier> : vrai si l’argument existe et non vide
non.Citation:
test -e <nom_fichier> : vrai si l’argument existe
la vérification de l'existence d'un argument se fait par -n, parce qu'un argument (ou "paramètre") est forcément une chaîne.Code:
1
2 $ help test | grep -- -e\\\> -e FICHIER Vrai si le fichier existe.
il faut entendre "fichier" au sens large, puisque sur Linux tout est fichier (fichier, lien, répertoire, périphérique...)la première partition du premier disque dur du système est un bien fichier.Code:
1
2
3 $ test -e /dev/sda1; echo $? 0 $
Bonsoir,
un peu HS mais toujours utile :
On n'avait pas dit qu'il ne fallait plus utiliser cette manière d'écrire, car au cas où plusieurs disques, /dev/sda1 n'est pas toujours le premier disque et autant prendre de bonnes habitudes dès le début, non ? :P
source : https://www.debian-fr.org/t/besoin-d...egarde/87902/5Citation:
Les noms /dev/sd* ne sont pas persistants. Ils sont attribués dans l’ordre de détection des disques. Le disque de sauvegarde pourrait très bien être /dev/sda s’il est présent au démarrage et détecté avant le disque interne, ou /dev/sdc si un autre disque ou clé USB est présent et vu comme sdb…
Avec un identifiant persistant, ce n’est pas un problème. La syntaxe est UUID=xxxx ou LABEL=xxxx (infos affichées par blkid) au lieu de /dev/sdb1.
avec bien sûr la blagounette suivante, trouvée dans man blkid : plutôt utiliser lsblk.
:coucou:
Sur le principe, je suis d'accord... :ccool:
Attention ! Avec le "zsh", la variable status est "spéciale/réservée/protégée/read-only" (cochez la case qui vous convient)... :aie:
Quand j'ai voulu porter mes scripts sh ou bash en zsh, j'ai dû renommer les variables status en statut, par exemple !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 % cat test.zsh #!/bin/zsh foo() { local status echo 'coucou'; status=$? echo "status: $status" } foo % ./test.zsh coucou foo:2: read-only variable: status
Et il me semble que $status a la même valeur que $?.