Script if, question vraiment bête

Bonjour, alors voila , j’essaye de comprendre l’utilisation de « if » pour faire quelque chose par la suite

sauf que même un truc basique ne marche pas, et j’arrive pas spécialement a trouver une solution a ce problème

voici le srcipt ( exemple trouvé sur internet ):

#!/bin/bash
if grep romain /etc/passwd
then
   echo "romain possède un compte";
else
   echo "romain ne possède pas de compte";
fi

quand je lance ce script : bash monscript
j’ai ceci : erreur de syntaxe : fin de fichier prématurée

si vous avez une idée pour m’aiguiller sur le soucis ^^
merci

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 :smiley:

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 :slight_smile:
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 :confused:

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)

1 J'aime

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

1 J'aime

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 :slight_smile:
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

1 J'aime

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 :slight_smile:
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 :slight_smile:

ok, suffit de le savoir quand on enregistre :slight_smile: C’était aussi une petite pique à windows

As usual :wink: :smiley:

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.