# [bash] break sur un read vide (boucle for in) - résolu

## pti-rem

```
for tn in t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12; do

echo "Entrez la ligne "$tn" du tableau à compter :"

read -a $tn

done
```

Bonjour,

Je rentre de 1 à 12 tableaux unidimensionnels avec ce code mais je n'arrive pas à imposer un break pour sortir de la boucle sur saisie vide.

J'ai essayé de tester 

```
[[ ${tn[*]} == "" ]]
```

mais ça ne tourne pas bien ; dans cette boucle, 

```
${tn[*]}
```

n'est pas interprété comme le contenu du tableau.

Comment je peux faire un test pour détecter une entrée vide ?

MerciLast edited by pti-rem on Tue Nov 28, 2017 11:28 am; edited 3 times in total

----------

## pti-rem

Je n'ai pas trouvé pour une saisie vide mais j'ai trouvé pour gérer la sortie sur CTRL-D

```
for tn in t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12; do

echo "Entrez la ligne "$tn" du tableau à compter (CTRL-D pour arrêter) :"

read -a $tn

if [[ `echo $?` == 1 ]]; then break; fi

done
```

----------

## Mr. T.

Il est étonnant de créer douze tableaux consécutivement. Quel est le motif ?

```
declare -a tab{1..12}

for tab in tab{1..12}; do

   read -p "Dimension de $tab ? : " nb

   for (( i=0; i<nb; i++ )); do

      read -p "${tab}[$i] : " ${tab}[i];

   done

done

```

helecho.

----------

## pti-rem

C'est une tâche qu'une connaissance réalise difficilement en VBA Excel et j'ai essayé ce matin de mon côté. Il appelle ça un paradigme, moi, une simple numération ou énumération de combinaisons.

La destination est pour aider un homéopathe en retraite au choix des "sucres" en automatisant une partie de la démarche ; je n'en sais guère plus sauf qu'il y a la connaissance de métier qui élimine des combinaisons.

C'est donc pour établir à la demande une énumération d'un tableau variable de signes - parmi 68 - d'un maximum 12 lignes d'un maximum 6 colonnes ou signes ; comme par exemple ce qui suit.

Ce n'est qu'un vulgaire exemple.

Merci pour le code helecho  :Smile:  ainsi que pour ta réponse.

```
rem@n73sm ~ $ ./compte-homeo3.sh 

Entrez la ligne 1 du tableau à compter (CTRL-D pour arrêter) :

plage herbe nuit 99p voilà voile

Entrez la ligne 2 du tableau à compter (CTRL-D pour arrêter) :

autrement 12o salutations non

Entrez la ligne 3 du tableau à compter (CTRL-D pour arrêter) :

réccurent angoisse seul

Entrez la ligne 4 du tableau à compter (CTRL-D pour arrêter) :

^D
```

```
Votre entrée :

plage herbe nuit 99p voilà voile

autrement 12o salutations non

réccurent angoisse seul
```

```
La numération :

plage autrement réccurent

plage autrement angoisse

plage autrement seul

plage 12o réccurent

plage 12o angoisse

plage 12o seul

plage salutations réccurent

plage salutations angoisse

plage salutations seul

plage non réccurent

plage non angoisse

plage non seul

herbe autrement réccurent

herbe autrement angoisse

herbe autrement seul

herbe 12o réccurent

herbe 12o angoisse

herbe 12o seul

herbe salutations réccurent

herbe salutations angoisse

herbe salutations seul

herbe non réccurent

herbe non angoisse

herbe non seul

nuit autrement réccurent

nuit autrement angoisse

nuit autrement seul

nuit 12o réccurent

nuit 12o angoisse

nuit 12o seul

nuit salutations réccurent

nuit salutations angoisse

nuit salutations seul

nuit non réccurent

nuit non angoisse

nuit non seul

99p autrement réccurent

99p autrement angoisse

99p autrement seul

99p 12o réccurent

99p 12o angoisse

99p 12o seul

99p salutations réccurent

99p salutations angoisse

99p salutations seul

99p non réccurent

99p non angoisse

99p non seul

voilà autrement réccurent

voilà autrement angoisse

voilà autrement seul

voilà 12o réccurent

voilà 12o angoisse

voilà 12o seul

voilà salutations réccurent

voilà salutations angoisse

voilà salutations seul

voilà non réccurent

voilà non angoisse

voilà non seul

voile autrement réccurent

voile autrement angoisse

voile autrement seul

voile 12o réccurent

voile 12o angoisse

voile 12o seul

voile salutations réccurent

voile salutations angoisse

voile salutations seul

voile non réccurent

voile non angoisse

voile non seul
```

# récurrent s'écrit bien ici  :Wink: 

----------

## Mr. T.

Le code présenté est partiel et incomplet : la saisie de l'utilisateur n'est pas contrôlé, par exemple.

 *pti-rem wrote:*   

> Comment je peux faire un test pour détecter une entrée vide ?

 

Il existe sûrement plusieurs façons. e.g. if [[ -z $string ]] ; then break; fi

helecho.

----------

## pti-rem

Tout à fait  :Wink: 

Je peux poser le script complet mais c'était pas le sujet.

Pour le contrôle, il n'y aura rien du tout ou alors une feuille de choux (un manuel) pour dire en gros que l'espace sépare les signes.

C'est juste un script test helecho.

Il fonctionne comme je le voulais.

En pratique, il faut rediriger les combinaisons sorties dans un fichier texte.

Mon script ne servira pas, je pense.

Ce sera fait avec le VBA truc...

édition :  *helecho wrote:*   

> Il existe sûrement plusieurs façons. e.g. if [[ -z $string ]] ; then break; fi 

 

J'en ai trouvé aucune, ni celle-là ou une autre.

----------

## Mr. T.

Il faut bien connaître bash pour écrire des scripts bash. La lecture de la documentation (e.g. info bash, man bash) n'est pas attrayante mais est nécessaire.

Édition : Il faut avoir des notions en programmation pour comprendre les manuels.

----------

## xaviermiller

 *helecho wrote:*   

> Il faut bien connaître bash pour écrire des scripts bash. La lecture de la documentation (e.g. info bash, man bash) n'est pas attrayante mais est nécessaire.
> 
> Édition : Il faut avoir des notions en programmation pour comprendre les manuels.

 

Bonjour,

Je ne partage pas cet avis. Un script n'a pas toujours la vocation de contenir des algorithmes que seuls des programmeurs puissent créer.

Et des avis de ce genre ne sont pas très constructifs, ils vont plutôt faire taire les débutants qui n'oseront plus parler face à des élites...

----------

## xaviermiller

Et pour répondre à la question, j'ai peut-être une piste ici: https://stackoverflow.com/questions/17297022/break-a-bash-loop-when-return-is-hit

----------

## pti-rem

Bonjour,

Dans cette boucle for tn in, $tn prend les valeurs de t1 à t12 ; qu'il y ait une saisie ou une simple validation. Donc le test [ -z $tn ] est toujours faux.

Je n'arrivais pas à obtenir le contenu du tableau $tn saisi dans la boucle for tn in pour pouvoir l'utiliser et faire un break si il est vide.

Je viens de trouver une solution  :Smile:  avec eval et '$' pour avoir le contenu de mon tableau saisi et le tester vide ou non.

```
#!/bin/bash

# compte-homeo4.sh

for tn in t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12; do

echo "Entrez la ligne "$tn" du tableau à compter (touche Entrée seule ou séquence CTRL-D pour arrêter) :"

read -a $tn

eval tx='$'{$tn[*]}                               # c'est ici que tx prend la valeur de la saisie du tableau lu précédemment.

if [[ `echo $?` == 1 ]]; then break; fi           # sortie sur CTRL-D ou erreur (code de sortie d'exécution 1)

if [[ $? -eq 0 ]] && [[ -z $tx ]]; then break; fi # sortie sur saisie vide

done
```

Merci bien xaviermiller  :Smile: 

Je partage ton opinion.

----------

## Mr. T.

Le test que j'ai présenté est faux mais je ne sais pas comment procéder (trouver une solution simple et intuitive).

On peut se demander pourquoi la lecture de la documentation est nécessaire.Last edited by Mr. T. on Tue Nov 28, 2017 3:57 pm; edited 1 time in total

----------

## pti-rem

helecho ?

Quel test ?

Procéder à quoi ou pour quoi ?

Je ne te comprends pas, explique.

----------

## Mr. T.

Vérifier que l'utilisateur a entré une donnée convenable lors de l'initialisation d'un élément d'un tableau.

```
if [[ -z $string ]]; then

   break

fi
```

helecho.

----------

## pti-rem

Tu devrais ouvrir un nouveau sujet helecho, celui-là est résolu et il n'est pas en rapport avec ton questionnement.

Autrement, essaie d'abord de mieux définir ce que tu définis comme « convenable »

----------

## Mr. T.

D'accord. Je ne vais pas ouvrir un fil de discussion car j'ai plus important à faire.

----------

## pti-rem

On aurait pu aller au bar, mais je suis abstinent  :Wink: 

----------

