# Script if, question vraiment bête

**URL:** <https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278>\
**Category:** Programmation\
**Created:** [Mars 21, 2021, 2:02 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278 "2021-03-21T14:02:01Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 2:02 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/1 "2021-03-21T14:02:01Z")

</div>

Bonjour, alors voila , j’essaye de comprendre l’utilisation de «&nbsp;if&nbsp;» 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

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Mars 21, 2021, 2:51 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/2 "2021-03-21T14:51:55Z")

</div>

```auto
if [-z "`grep romain /etc/password`"]; then
 echo "romain possède un compte"
else
  echo "romain ne possède pas de compte"
fi

```

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 2:54 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/3 "2021-03-21T14:54:04Z")

</div>

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 ?

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Mars 21, 2021, 2:55 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/4 "2021-03-21T14:55:14Z")

</div>

Ne pas oublier la ligne du bash au debut. je n’ai refait que le if.

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 2:57 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/5 "2021-03-21T14:57:44Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Mars 21, 2021, 2:59 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/6 "2021-03-21T14:59:50Z")

</div>

l’erreur c’est `/etc/passwd` et non pas `/etc/password` 😃

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 3:00 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/7 "2021-03-21T15:00:57Z")

</div>

ca ne change rien au soucis ^^

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Mars 21, 2021, 3:08 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/8 "2021-03-21T15:08:58Z")

</div>

```auto
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

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 3:13 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/9 "2021-03-21T15:13:39Z")

</div>

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 😕

---

<div class="post-metadata">

**Author:** ![littlejohn75](https://www.debian-fr.org/user_avatar/www.debian-fr.org/littlejohn75/32/3840_2.png) [@littlejohn75](https://www.debian-fr.org/u/littlejohn75)\
**Post date:** [Mars 21, 2021, 3:20 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/10 "2021-03-21T15:20:19Z")

</div>

> [@splintermik](#):
>
> , j’essaye de comprendre l’utilisation de « if » pour faire quelque chose par la suite

Louable initiative. La question relève plutôt du forum «&nbsp;Programmation&nbsp;» à mon avis, elle n’est pas propre à Debian.

> [@splintermik](#):
>
> ```auto
> #!/bin/bash
> if grep romain /etc/passwd
> then
> echo "romain possède un compte";
> else
> echo "romain ne possède pas de compte";
> fi
> 
> ```

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

```auto
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

```auto
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 à

```auto
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)

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 3:26 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/11 "2021-03-21T15:26:43Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![littlejohn75](https://www.debian-fr.org/user_avatar/www.debian-fr.org/littlejohn75/32/3840_2.png) [@littlejohn75](https://www.debian-fr.org/u/littlejohn75)\
**Post date:** [Mars 21, 2021, 3:38 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/12 "2021-03-21T15:38:01Z")

</div>

> [@splintermik](#):
>
> 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 ?

```auto
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

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 4:24 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/13 "2021-03-21T16:24:13Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![littlejohn75](https://www.debian-fr.org/user_avatar/www.debian-fr.org/littlejohn75/32/3840_2.png) [@littlejohn75](https://www.debian-fr.org/u/littlejohn75)\
**Post date:** [Mars 21, 2021, 5:25 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/14 "2021-03-21T17:25:22Z")

</div>

> [@splintermik](#):
>
> pouvoir exécuter automatiquement une commande si un fichier spécifique et vide

Pas besoin de `if` explicite.

```auto
touch /tmp/vide

```

```auto
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

```auto
[condition...] || commande à lancer (fichier vide ou inexistant )

```

est plus concise et plus adaptée qu’un `if`.

```bash
$ if [! -s /tmp/vide] 
> then
> echo lancer commande car vide
> fi
lancer commande car vide
$

```

ou

```bash
$ [-s /tmp/vide] || echo lancer commande car vide
lancer commande car vide
$

```

il n’y a pas photo

> [@splintermik](#):
>
> j’edite le fichier avec notepad++ dpuis le sftp , encodage utf-8 , langage shell

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)

> [@splintermik](#):
>
> ```auto
> : Aucun fichier ou dossier de ce type
> : nombre entier attendu comme expression
> non
> 
> ```

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

```auto
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

---

<div class="post-metadata">

**Author:** ![splintermik](https://www.debian-fr.org/user_avatar/www.debian-fr.org/splintermik/32/2811_2.png) [@splintermik](https://www.debian-fr.org/u/splintermik)\
**Post date:** [Mars 21, 2021, 5:29 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/15 "2021-03-21T17:29:00Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Mars 22, 2021, 12:19 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/16 "2021-03-22T12:19:33Z")

</div>

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++

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Mars 22, 2021, 4:22 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/17 "2021-03-22T16:22:55Z")

</div>

> [@dindoun](#):
>
> 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 🙂

---

<div class="post-metadata">

**Author:** ![dindoun](https://www.debian-fr.org/user_avatar/www.debian-fr.org/dindoun/32/4281_2.png) [@dindoun](https://www.debian-fr.org/u/dindoun)\
**Post date:** [Mars 22, 2021, 5:25 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/18 "2021-03-22T17:25:12Z")

</div>

> [@Zargos](#):
>
> 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

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Mars 22, 2021, 10:33 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/19 "2021-03-22T22:33:52Z")

</div>

As usual 😉 😃

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Mars 23, 2021, 3:43 UTC](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278/20 "2021-03-23T15:43:11Z")

</div>

Notepad++ permet d’écrire ses fichiers en utilisant les fins de ligne «&nbsp;à la Linux&nbsp;», c’est-à-dire LF, plutôt que des fins de lignes «&nbsp;à la Windows&nbsp;» (CRLF). C’est en bas à droite, à côté de la case où on peut choisir l’encodage.

[Page suivante](https://www.debian-fr.org/t/script-if-question-vraiment-bete/84278.md?page=2)
