# Lecture fichier script bash

**URL:** <https://www.debian-fr.org/t/lecture-fichier-script-bash/20666>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666 "2016-02-20T20:17:23Z")\
**Posts on this page:** 16\
**Page:** 1

<div class="post-metadata">

**Author:** ![fret92](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/3ec8ea/32.png) [@fret92](https://www.debian-fr.org/u/fret92)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/1 "2016-02-20T20:17:23Z")

</div>

Bonjour,

je souhaite realiser un script en bash pour ajouter des utilisateurs samba  
je souhaite realiser une condition du type

```auto
si $users existe dans /etc/samba/smbpasswd
alors
l'utilisateur existe
sinon 
"creation de l'utilisateur"
fin si 
```

Pour cela j’ai essayer

```auto
if [cat "/etc/samba/smbpasswd" = "$users"]
```

cela ne semble pas fonctionner

Je suis debutant en bash et je souhaite realiser un script le plus simple possible  
si une ame charitable peu me venir en aide je lui en serait reconnaissant

amicalement,

Fret

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/2 "2016-02-20T20:17:25Z")

</div>

Regarde du coté de la commande grep. 😛

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/3 "2016-02-20T20:17:41Z")

</div>

J’ai la flemme de regarder la syntaxe d’un fichier utilisateur de samba,  
donc je te donne un exemple qui marche avec /etc/passwd :

`if cat /etc/passwd | cut -f 1 -d : | grep -q '^BBT$'; then
  echo ok
else
  echo fail
fi`

Donc là je prend mon fichier passwd,  
je prend uniquement le premier des champs séparés par des :  
je regarde si une ligne contient exactement mon login BBT (sans rien affichier sur la sortie standard)  
et j’effectue un traitement :  
j’affiche ok si je suis présent dans les utilisateurs,  
sinon j’affiche fail.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/4 "2016-02-20T20:17:47Z")

</div>

Cache se cat que nous ne sauront voir

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/5 "2016-02-20T20:17:49Z")

</div>

`if cut -f 1 -d : </etc/passwd | grep -q '^BBT$'; then
  echo ok
else
  echo fail
fi`

Mais bon, je pensais que c’était plus facile à expliquer en montrant explicitement le cat…

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/6 "2016-02-20T20:17:50Z")

</div>

En fait,

`if cut -f 1 -d : /etc/passwd | grep -q '^BBT$'; then
  echo ok
else
  echo fail
fi`  
fonctionne, cut avec un argument ouvre le fichier.  
Cela dit, dans une succession de traitement comme cela, j’écris le «cat», chacun sa méthode…

---

<div class="post-metadata">

**Author:** ![fret92](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/3ec8ea/32.png) [@fret92](https://www.debian-fr.org/u/fret92)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/7 "2016-02-20T20:17:54Z")

</div>

tous dabord un grand merci 🙂

mon script est fonctionnel grace a la commande if fourni pour ceux que cela interesse voici mon script n’hesiter pas si il y a des choses a dire

```auto
#!/bin/bash
# SCRIPT ajout_users_smb.sh

#definition des variables
#==========================
echo Entrer le nom d utilisateurs :
read nom_users
echo Dans quel groupe doit etre l utilisateur :
read nom_groupe

#Creation du compte
#==================

if cut -f 1 -d : </etc/samba/smbpasswd | grep -q '$nom_users';
then
echo l utilisateur $nom_users existe deja
else
useradd -G $nom_groupe -m -N -d /srv/samba/home/$nom_users -s /bin/false $nom_users
fi

echo entrer le mot de passe pour l utilisateur $nom_users
smbpasswd -a $nom_users

```

les boucles de type while existe t’elle en bash ?  
je pense par la suite rajouter une condition

Merci de votre aide

Fret

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:17 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/8 "2016-02-20T20:17:55Z")

</div>

syntaxe :

`while <condition>; do
  <contenu>
done`

exemple :

`VAR=0
while ["$VAR" -lt 10]; do
  VAR=$((VAR+1))
  echo VAR = $VAR
done`

Pour référence :  
[Bash Reference Manual](http://www.faqs.org/docs/bashman/bashref_toc.html#SEC_Contents)

---

<div class="post-metadata">

**Author:** ![fret92](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/3ec8ea/32.png) [@fret92](https://www.debian-fr.org/u/fret92)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/9 "2016-02-20T20:18:02Z")

</div>

Je rencontre quelque soucis lorsque le script ci dessus est mis dans une boucle while.  
La boucle fonctionne correctement mais le script du dessus n’est plus fonctionnel ❓  
merci a ceux qui pourront eclairer ma lanterne

Voici le code : [code]  
#!/bin/bash

# SCRIPT [sambascript.sh](http://sambascript.sh)

#definition des variables  
#==========================  
while [-z $boucle] || [$boucle = ‘oui’];  
do

echo Entrer le nom d utilisateurs :  
read nom\_users

if cut -f 1 -d : \</etc/passwd | grep -q '$nom\_users’  
then  
echo l utilisateur $nom\_users existe deja  
else  
echo Dans quel groupe doit etre l utilisateur :  
read nom\_groupe

#Creation du compte  
#==================

useradd -G $nom\_groupe -m -N -d /srv/samba/home/$nom\_users -s /bin/false $nom\_users;

#Boucle while  
##############  
echo "voulez vous creer un autre utilisateur (oui/non)"  
read boucle  
fi

done  
[/code]

Le if n’est apparement plus effectif je ne comprend plus

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/10 "2016-02-20T20:18:03Z")

</div>

J’ai pas encore tout lu en détail mais je pense que mettre un set -x en début de script  
peut t’aider à conprendre ce qui se passe.  
Ça va activer le mode de debug de bash qui va afficher chaque ligne qui est interprétée  
et je crois les résultats intermédiaires aussi.

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/11 "2016-02-20T20:18:03Z")

</div>

Essaie de remplacer “cut -f 1 -d : \</etc/passwd” par “cut -f 1 -d : /etc/passwd”.  
Il est possible qu’on essaie de faire trop de choses en même temps sur l’entrée standard.

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/12 "2016-02-20T20:18:03Z")

</div>

[quote=“fret92”]if cut -f 1 -d : \</etc/passwd | grep -q ‘$nom\_users’  
[/code]

Le if n’est apparement plus effectif je ne comprend plus[/quote]

Désolé, je flood un peu je poste comme ça vient,  
$nom\_user est protégé avec des quotes simples,  
il n’est donc pas remplacé par sa valeur.

Utiliser des quotes doubles " à la place.

---

<div class="post-metadata">

**Author:** ![fret92](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/3ec8ea/32.png) [@fret92](https://www.debian-fr.org/u/fret92)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/13 "2016-02-20T20:18:04Z")

</div>

Merci de ton aide je test sa desuite 🙂

---

<div class="post-metadata">

**Author:** ![fret92](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/3ec8ea/32.png) [@fret92](https://www.debian-fr.org/u/fret92)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/14 "2016-02-20T20:18:04Z")

</div>

le fait de changer les simple quote en double cote a resolu mon probleme 🙂  
une après midi pour un detail comme cela, je ne pense pas refaire la meme erreur de si tot

Merci de votre aide a tous

Voici pour ceux que sa interesse le script modifier et fonctionnel

```auto
#!/bin/bash
#SCRIPT sambascript.sh
#definition des variables
#==========================

while [-z $boucle] || [$boucle = 'oui'];
do

echo Entrer le nom d utilisateurs :
read nom_users;

if cut -f 1 -d: </etc/passwd | grep -q "$nom_users";
then
echo l utilisateur $nom_users existe deja
exit 0
else
echo Dans quel groupe doit etre l utilisateur :
read nom_groupe

#Creation du compte
#==================
useradd -G $nom_groupe -m -N -d /srv/samba/home/$nom_users -s /bin/false $nom_users

#Boucle while
#============
echo "voulez vous creer un autre utilisateur? : (oui/non)"
read boucle
fi
done
```

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/15 "2016-02-20T20:18:07Z")

</div>

[quote=“fret92”]le fait de changer les simple quote en double cote a resolu mon probleme 🙂  
une après midi pour un detail comme cela, je ne pense pas refaire la meme erreur de si tot  
[/quote]

😃 En fait le truc en bash,  
c’est de comprendre que l’on manipule du texte,  
et d’identifier comment et dans quel ordre ce texte est remplacé dans les différentes expressions.

Une fois qu’on a bien saisi ça, la bash devient d’un coup beacoup plus limpide  
(bon, pour maîtriser faut pratiquer aussi 😉 )

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 8:18 UTC](https://www.debian-fr.org/t/lecture-fichier-script-bash/20666/16 "2016-02-20T20:18:11Z")

</div>

Ça vaut pour tout script shell.  
D’ailleurs je crois pas que tu utilise des particularités de bash donc autant remplacer ton shbang par :

```auto

```
