# Script Bash Test de connection + petite erreur

**URL:** <https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000>\
**Category:** Trucs et Astuces\
**Created:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000 "2016-02-21T21:41:14Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![VanX98](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/51bf81/32.png) [@VanX98](https://www.debian-fr.org/u/VanX98)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/1 "2016-02-21T21:41:14Z")

</div>

Salut  
Voila je ne savais pas quoi faire dont j’ai codé ! ![:007](https://www.debian-fr.org/uploads/default/original/1X/e72d3b45191f9b2363aa21bfae6f42497bc4042b.gif "yeux-coeur")

Le script

`#!/bin/bash
echo "" >> NetStat.log
date +"%m-%d-%Y-%T" >> NetStat.log
ping -c 3 -i 2 testdebit.info >> NetStat.log
iperf -c iperf.testdebit.info -i 2 -t 20 -r >> NetStat.log
wget http://1.testdebit.info/fichiers/1Mo.dat -O /dev/null 2>&1 | tail -2 >> NetStat.log
`

L’output

```auto
05-26-2015-15:01:28
PING testdebit.info (46.227.16.8) 56(84) bytes of data.
64 bytes from lafibre.info (46.227.16.8): icmp_seq=1 ttl=54 time=327 ms
64 bytes from lafibre.info (46.227.16.8): icmp_seq=2 ttl=54 time=350 ms
64 bytes from lafibre.info (46.227.16.8): icmp_seq=3 ttl=54 time=387 ms

--- testdebit.info ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4002ms
rtt min/avg/max/mdev = 327.449/355.059/387.313/24.659 ms
------------------------------------------------------------
Client connecting to iperf.testdebit.info, TCP port 5001
TCP window size: 45.0 KByte (default)
------------------------------------------------------------
[4] local 10.255.255.104 port 53275 connected with 89.84.127.54 port 5001
[ID] Interval Transfer Bandwidth
[4] 0.0- 2.0 sec 256 KBytes 1.05 Mbits/sec
[4] 2.0- 4.0 sec 384 KBytes 1.57 Mbits/sec
[4] 4.0- 6.0 sec 896 KBytes 3.67 Mbits/sec
[4] 6.0- 8.0 sec 1.25 MBytes 5.24 Mbits/sec
[4] 8.0-10.0 sec 1.75 MBytes 7.34 Mbits/sec
[4] 10.0-12.0 sec 1.88 MBytes 7.86 Mbits/sec
[4] 12.0-14.0 sec 2.75 MBytes 11.5 Mbits/sec
[4] 14.0-16.0 sec 1.75 MBytes 7.34 Mbits/sec
[4] 16.0-18.0 sec 1.75 MBytes 7.34 Mbits/sec
[4] 18.0-20.0 sec 1.62 MBytes 6.82 Mbits/sec
[4] 0.0-20.2 sec 14.4 MBytes 5.97 Mbits/sec
2015-05-26 15:04:55 (54,1 KB/s) — « /dev/null » sauvegardé [10000000/10000000]
```

Cependant, J’ai une erreure lors de l’execution :

`machin@truc/home/user# ./NetStat.sh 
bind failed: Address already in use
`

Si vous avez des idées/optimisation ou conseil (“C’est de la merde ske tu fait !”)  
ps:Premier scripte en Bash que je fais , soyez cool 😛

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/2 "2016-02-21T21:41:21Z")

</div>

Correction de ton code :

```auto
#!/bin/bash
touch NetStat.log
{
    date +"%m-%d-%Y-%T"
    ping -c 3 -i 2 testdebit.info
    iperf -c iperf.testdebit.info -i 2 -t 20 -r
    wget http://1.testdebit.info/fichiers/1Mo.dat -O /dev/null 2>&1 | tail -2
} >> NetStat.log
```

Cette [page](https://github.com/koalaman/shellcheck/wiki/SC2129) explique succinctement pourquoi il est mieux de l’écrire ainsi! 😉

Ah, oui, au fait … si tu décides de le publier aux autres, il ne te faut pas oublier de mentionner l’installation de l’outil iperf qui n’est généralement pas installé par défaut !

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/3 "2016-02-21T21:41:21Z")

</div>

> [@](#):
>
> Ah, oui, au fait … si tu décides de le publier aux autres, il ne te faut pas oublier de mentionner l’installation de l’outil iperf qui n’est généralement pas installé par défaut !

Un exemple de test de dépendances tel que je les implémente dans mes scripts, celui-ci interrompt le script avec un message si l’une des commandes [mono]innoextract[/mono] ou [mono]fakeroot[/mono] est introuvable dans le $PATH de l’utilisateur :

`# Contrôle des dépendances
for dep in innoextract fakeroot; do
	if [-z $(which $dep)]; then
		echo "$dep est introuvable."
		echo "Installez-le avant de lancer ce script."
		exit 1
	fi
done`  
À ajouter bien sûr en début de script, avant invocation de ces commandes.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/4 "2016-02-21T21:41:21Z")

</div>

Bien vu, vv222.

Même si, dans ce cas, j’aurais fait :

```auto
iperf="$(which iperf)"

if [[-n ${iperf}]]; then ... fi
```

Ton exemple est intéressant, mais pareil, je préfère mettre les différentes commandes dans un tuple, puis appeler le tuple comme dans ta boucle, tel que :

```auto
declare -a APPS=('innoextract' 'fakeroot' 'iperf')

# Contrôle des dépendances
for dep in "${APPS[@]}"; do
   if [-z "$(which "${dep}")"]; then
      echo -e "${dep} est introuvable. \n Installez-le avant de lancer ce script. \n"
      exit 1
   fi
done
```

L’avantage du tuple, pour moi, est que c’est plus simple à gérer pour enlever/ajouter une commande, plutôt que dans la boucle ‘for’ …

PS : au fait, si je n’ai pas donné d’exemple à-propos du test, c’était surtout pour qu’il cherche par lui-même …  
Maintenant, il a deux exemples, assez similaires qui lui montrent comment … et lui font comprendre aussi, qu’en dev, il y a souvent plusieurs façons de faire 😉

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/5 "2016-02-21T21:41:21Z")

</div>

Une méthode intéressante que ce “tuple”, qu’en bon autodidacte je ne connaissais pas. Merci pour la rapide explication, il ne se passera sûrement pas longtemps avant que je ne lui trouve un usage dans mes projets shell.

À moins que ce ne soit une fonction typique de bash incompatible avec le shell POSIX ?

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/6 "2016-02-21T21:41:21Z")

</div>

RAhhh, crétin, je viens de remarquer un abus de language de ma part …  
Le terme ‘tuple’ est emprunté au Python (tsss…), dans le cas de Bash, c’est un tableau 😉

Après, je ne vois pas en quoi ce ne serait pas “Posix Compliance” …  
Mais, sur cette question, je ne suis vraiment pas calé du tout !

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/7 "2016-02-21T21:41:21Z")

</div>

[quote=“PengouinPdt”]Après, je ne vois pas en quoi ce ne serait pas “Posix Compliance” …  
Mais, sur cette question, je ne suis vraiment pas calé du tout ![/quote]  
Et bien le plus simple reste sûrement que j’essaye avant de revenir faire mon rapport.

* * *

[mono]Syntax error: “(” unexpected[/mono]

C’est bien un “bashisme”, dash n’est pas capable de l’interpréter sous cette forme.

---

<div class="post-metadata">

**Author:** ![VanX98](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/51bf81/32.png) [@VanX98](https://www.debian-fr.org/u/VanX98)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/8 "2016-02-21T21:41:22Z")

</div>

Merci PengouinPdt, ne conaissant pas encore le bash j’ai fait au plus basique ! mais je vois tres bien tes amélioration ! on passe du basique à quelquechose de simple mais optimisé !

Ca fait quand méme du bien de coder de temps en temps 😛

ps: la prochaine fois je tacherais de faire mieux et de le poster correctement (en n’oubliant pas l’install par exemple !)

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/9 "2016-02-21T21:41:41Z")

</div>

quote=“vv222”  
[mono]Syntax error: “(” unexpected[/mono]

C’est bien un “bashisme”, dash n’est pas capable de l’interpréter sous cette forme.[/quote]

En effet, c’est un bashisme.

Tu peux donc l’écrire ainsi :

```auto
#!/bin/sh
set -- innoextract fakeroot iperf

# Contrôle des dépendances
for dep in "$@"; do
   if [-z "$(which "${dep}")"]; then
      printf "%s est introuvable. \n Installez-le avant de lancer ce script. \n" "${dep}"
      exit 1
   fi
done

```

Quel dommage que les variables de type tableau n’existent pas en POSIX … ou je n’ai vraiment pas trouvé comment faire !

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/10 "2016-02-21T21:41:47Z")

</div>

[quote=“PengouinPdt”]Tu peux donc l’écrire ainsi :

[code]  
#!/bin/sh  
set – innoextract fakeroot iperf

# Contrôle des dépendances

for dep in “$@”; do  
(…)  
[/code][/quote]  
Sauf erreur de ma part, ça “écrase” les éventuels arguments donnés au script au moment de son lancement, non ?

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/11 "2016-02-21T21:41:48Z")

</div>

Comme tu le remarques avec ce bout de code, c’est à toi de veiller à récupérer tes arguments avant d’initialiser les variables 😉

```auto
#!/bin/sh
#set -x
arg1="$1"
printf "1: %s \n" "${arg1}"
set -- innoextract fakeroot iperf
printf "1: %s - ${arg1} \n" "$1"
```

Puisqu’en effet, set réinitialise les variables spéciales … donc avant d’initialiser, tu test le nombre d’arguments passés, et s’il y en a, tu les attribues à une variable … 😃

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/12 "2016-02-21T21:41:48Z")

</div>

Je prends des notes, cette discussion est franchement enrichissante et devrait me permettre d’améliorer efficacement mes nombreux scripts shell.  
Pour les curieux, un aperçu des scripts sur lesquels je travaille ces temps-ci peut se trouver par ici :  
[dotslashplay.it/scripts/fr/](https://www.dotslashplay.it/scripts/fr/)  
(certificat auto-signé,  
SHA1 : 08:7A:58:99:48:DF:C1:2D:F8:80:C3:3B:0F:B1:B9:76:F4:D6:89:E1  
MD5 : 6F:72:65:0F:5E:B5:BC:84:6F:10:6B:26:BF:87:3B:8A)

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Février 21, 2016, 9:41 UTC](https://www.debian-fr.org/t/script-bash-test-de-connection-petite-erreur/66000/13 "2016-02-21T21:41:48Z")

</div>

Tiens pour toi:

```auto
nb_args="$#"
i=1

if [-n "$nb_args"]; then
    for arg in "$@"; do
        export arg$i="${arg}"
        i=$(($i+1))
    done
fi
unset i

printf "1: %s \n" "${arg1}"
set -- innoextract fakeroot iperf
printf "1: %s - ${arg1} \n" "$1"
```

Et, pour le fun, se rendre compte que c’est faisable avec la syntaxe HEREDOC, et une belle boucle while - “so, too much? it’s up to you!” :

```auto
deps="innoextract
fakeroot
iperf"

while read -r cmd; do
    printf "Checking $cmd ...\n"
    if ! command -v "$cmd"; then
        printf "Error: $cmd not found\n"
    else
        printf "Success: $cmd found\n"
    fi
    printf "\n"
done <<EOF
$deps
EOF
```

Cette dernière n’est pas de moi, je viens de la trouver [ici](https://stackoverflow.com/questions/26008487/how-to-iterate-over-double-quoted-strings-in-posix-shell) (cf, en fin de page) !

Amuse-toi bien 😃 😉
