if [ -z "`grep romain /etc/password`" ]; then
echo "romain possède un compte"
else
echo "romain ne possède pas de compte"
fi
merci de t’as réponse, il y a t’il d’autre éléments a rajouter dans le script, ou le script peux il fonctionner ainsi ?
Ne pas oublier la ligne du bash au debut. je n’ai refait que le if.
si je met le script avec le bash au debut " #!/bin/bash" , que j’appuis pas sur entrée a la fin , j’ai donc 6 ligne , si je lance le script :
monscript: ligne 6: erreur de syntaxe près du symbole inattendu « fi »
monscript: ligne 6: `fi'
si j’appuis sur entrée a la fin, j’ai donc 7 ligne, si je lance le script :
monscript: ligne 7: erreur de syntaxe : fin de fichier prématurée
je sais pas trop ce que je fais de mal :s
l’erreur c’est /etc/passwd
et non pas /etc/password
ca ne change rien au soucis ^^
if [ -n "`grep romain /etc/passwd`" ]; then
echo "romain possède un compte"
else
echo "romain ne possède pas de compte"
fi
C’est -n et pas -z
désolé, -z c’est pour tester si le résultat est vide, -n si le résultat n’est pas vide
j’ai toujours le même soucis, je ne pense pas que ca viens de la commande en elle même mais de la fin du script
Louable initiative. La question relève plutôt du forum « Programmation » à mon avis, elle n’est pas propre à Debian.
La syntaxe du shell est quelque fois contre intuitive. En particulier, si vous voulez tester le code retour d’une commande vous ne pouvez pas écrire directement if commande paramètre
, vous êtes obligé de lacer la commande et de traiter le code retour
- soit explicitement
grep romain /etc/apsswd
rc=$?
if [ $rc -eq 0 ] # notez la fonction test avec les crochets
then echo oui
else echo non
fi
- soit avec un raccourci
grep romain /etc/passwd && echo oui || echo non
Mais ce n’est pas tout. La sortie de la commande va apparaître dans la sortie du script et perturber ladite sortie.
D’autre part, l’utilisateur romain
peut avoir un compte sur le système sans avoir une entrée dans le fichier /etc/passwd
mais dans un autre mécanisme NSS comme NIS ou LDAP. La commande à utiliser est getent
.
Nous arrivons à
res=$(getent passwd romain) && echo oui || echo non
En résumé
Trouver la bonne commande
Se méfier des tests avec crochets (subtilité -z -n … -eq == ) et préférer les opérateurs && et || (pour tester un code retour).
Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة
F. Petitjean
Ingénieur civil du Génie Maritime.
« On ne perd pas son temps en aiguisant ses outils. »
Proverbe français
« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)
merci pour votre réponse
j’ai donc mis ceci :
#!/bin/bash
grep root /etc/passwd
rc=$?
if [ $rc -eq 0 ] # notez la fonction test avec les crochets
then echo oui
else echo non
fi
et j’ai ceci en réponse :
: Aucun fichier ou dossier de ce type
: nombre entier attendu comme expression
non
il y a bien l’utilisateur root dans le fichier /etc/passwd
Vraisemblablement un caractère invisible en fin de ligne après le /etc/passwd .
Vous ne seriez pas en train d’éditer vos scripts avec un truc configuré pour du DOS par hasard ?
fp2@debpacha:~ $ getent passwd root && echo oui || echo non
root:x:0:0:root:/root:/bin/bash
oui
Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة
F. Petitjean
Ingénieur civil du Génie Maritime.
« Il est souvent trop tôt pour savoir s’il n’est pas trop tard. »
Pierre Dac
j’edite le fichier avec notepad++ dpuis le sftp , encodage utf-8 , langage shell
apres je ne cherche pas spécialement a trouver un nom dans la liste des passwd, je cherche a utiliser if, pour pouvoir exécuter automatiquement une commande si un fichier spécifique et vide
Pas besoin de if
explicite.
touch /tmp/vide
dash
$ [ -s /tmp/vide ] && echo non vide || echo vide ou pas là
vide ou pas là
$ exit
L’astuce [ -s fichier ] est expliquée dans man test
.
Dans votre cas, la syntaxe
[ condition... ] || commande à lancer (fichier vide ou inexistant )
est plus concise et plus adaptée qu’un if
.
$ if [ ! -s /tmp/vide ]
> then
> echo lancer commande car vide
> fi
lancer commande car vide
$
ou
$ [ -s /tmp/vide ] || echo lancer commande car vide
lancer commande car vide
$
il n’y a pas photo
Cela veut dire que l’édition est faite sur un poste Windows ? Il semblerait que vous cherchiez les ennuis.
Qu’entendez-vous par depuis le sftp
?
Pourquoi ne pas éditer directement sur la machine d’exécution ? (qui je l’espère est sous Debian)
Il faudrait mettre une option de déverminage, une instruction set -qqchose
mais j’ai la flemme de trouver quoi mettre
Pour vérifier les deux premières lignes
head -2 lescript.sh | od -c
parce que la première erreur est bien là !
Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة
F. Petitjean
Ingénieur civil du Génie Maritime.
Linux: the operating system with a CLUE… Command Line User Environment.
– seen in a posting in comp.software.testing
j’utilise depuis le sftp parce que c’est plus simple et plus rapide pour moi, oui la machine est sous debian , j’ai utilisé " [ condition… ] || commande à lancer " du coup pour faire ce que je voulais et ca marche très bien
merci pour votre aide
salut
les fins de fichier sont différentes pour mac/win/linux
0D 0A pour windows : \r\n
0D pour mac : \r
0A pour linux : \n
tu devrais mettre comme résolu la proposition 11 de littlejohn75, même si ailleurs tu as vu des trucs mieux écris.
un conseil :
quand ton ordi te donne une erreur, commence par ne pas chercher à l’interpréter ( plus facile à dire qu’à faire )
en conclusion, ton programme marchait , tu as juste utilisé un truc inconnu qui fait des erreurs de base, notepad++
j’utilise et je n’ai pas ce genre d’erreurs
ok, suffit de le savoir quand on enregistre C’était aussi une petite pique à windows
As usual
Notepad++ permet d’écrire ses fichiers en utilisant les fins de ligne « à la Linux », c’est-à-dire LF, plutôt que des fins de lignes « à la Windows » (CRLF). C’est en bas à droite, à côté de la case où on peut choisir l’encodage.
je ne conaissais pas LF et CRLF , merci