Problème avec les tableaux dans BASH [résolu]

Bonjour,

Pour parler clairement, je cherche quelqu’un qui va accepter de débugger mon programme…

Petit résumé de ce qu’il est sensé faire :
Y a un tableau créé avec des suites de 5 chiffres. Le script du programme prend en argument une valeur, c’est un chiffre; Ce chiffre doit être dans le tableau.
Le but du programme c’est de déterminer l’emplacement exact du chiffre dans le tableau.
Alors c’est balo parce que le programme fonctionne jusqu’à la troisième suite de 5 chiffres. à partir de la 4ième, il ne trouve plus.
Admettons que vous enregistriez le script sous le nom de cherche_chiffre.sh
Par exemple si vous lancez le script ainsi, $ ./cherche_chiffre.sh 17, le programme va répondre :

Numéro trouvé à l'index 1 . Entrée trouvée à la position : 2

Mais si vous saisissez $ ./cherche_chiffre.sh 24 alors là, y a aucun retour

 #!/bin/bash

 ### Création du tableau
 declare -a GrosTableau=("5 17 44 46 49 4" "11 14 28 41 43 8" "7 16 33 42 47 7" "17 24 26 40 43 9" "10 15 16 17 37 9" "5 18 26 38 41 10" "5 30 42 45 48 9" "9 10 14 16 29 1" "31 33 38 42 43 3" "9 13 22 28 35 5" "2 19 25 30 43 9" "7 8 12 22 33 5" "4 8 12 25 45 2" "15 21 33 35 48 1" "7 25 28 35 48 1" "9 20 23 24 28 4" "19 26 32 39 42 6" "7 11 18 21 42 3" "26 31 42 47 48 8" "6 17 19 30 49 2")
 
 ## affichage du tableau
 echo ${GrosTableau[@]}
 # cette boucle est sensée chercher une entrée définie par l'argument passée au lancement du script "$1"
 k=0
 while [[ "$k" < ${#GrosTableau[@]} ]];
 	do
 		declare -a tab=$(echo "tableau$k")
 		#echo $tab
 		tab=(${GrosTableau[$k]})
 		#echo "${tab[@]}"
 		for valeur in "${!tab[@]}";	# travail avec les indexs ($valeur prend les datas des indexs et non celles des entrees du tableau)
 				do
 					if [[ "$1" == "${tab[$valeur]}" ]]; then
 						posTab=$(($k+1))
 						posIndex=$(($valeur + 1))
 						echo "Numéro trouvé à l'index $posTab . Entrée trouvée à la position : $posIndex "
 						exit 0  # permet de sortir du programme pour éviter de rechercher les suivants
 					else
 						echo '' #"pas trouvé"
 					fi
 				done
 		((k++))
 	done

posTab=$(($k+1)) et posIndex=$(($valeur + 1)) , c’est juste pour rendre compréhensible la sortie du résultat, car la première entrée d’un tableau c’est 0…
Voilà, par avance, merci à celui, celle ou ceux qui auront la patience de découvrir le hic !

Parfois il est plus simple de repartir de 0, le script ci-dessous fonctionne. Pour info il transforme ton GrosTableau en un ensemble de petits à l’aide de la fonction read que tu sembles ne pas connaître.
J’ai un peu modifié les choses, le script te donne tous les index trouvés et pas uniquement le premier, il est facile de le modifier si tu souhaites tj le 1er.

Des exemples
./es_tableau2.bash 17
Numéro trouvé aux index 0 3 4 19 . Entrée trouvée aux positions : 1 0 3 1
./es_tableau2.bash 24
Numéro trouvé aux index 3 15 . Entrée trouvée aux positions : 1 3
./es_tableau2.bash 333
Non trouvé

et le script

#!/bin/bash
    cherche=$1
    gt=("5 17 44 46 49 4" "11 14 28 41 43 8" "7 16 33 42 47 7" "17 24 26 40 43 9" "10 15 16 17 37 9" "5 18 26 38 41 10" "5 30 42 45 48 9" "9 10 14 16 29 1" "31 33 38 42 43 3" "9 13 22 28 35 5" "2 19 25 30 43 9" "7 8 12 22 33 5" "4 8 12 25 45 2" "15 21 33 35 48 1" "7 25 28 35 48 1" "9 20 23 24 28 4" "19 26 32 39 42 6" "7 11 18 21 42 3" "26 31 42 47 48 8" "6 17 19 30 49 2")
    # echo ${gt[@]}
    its=();jts=()
    for i in "${!gt[@]}"; do 
    #	echo $i,${gt[$i]}
        pt=${gt[$i]}
    	read -r -a pt <<< ${gt[$i]}    # <------ création d'un "petit tableau"
    #	echo ${pt[@]}
    	for j in "${!pt[@]}"; do
    #		echo $i/$j,${pt[$j]}
    		[[ $cherche == ${pt[$j]} ]] && { its=("${its[@]}" "$i");jts=(${jts[@]} $j); }
    	done	
    done
    [[ 0 -lt  ${#its[@]} ]] && echo "Numéro trouvé aux index ${its[@]} . Entrée trouvée aux positions : ${jts[@]}" || echo Non trouvé
1 J'aime

:face_with_thermometer: merci… (!)

De rien, pense à passer le post en résolu.

Dans votre programme, je dois souligner que c’est super bien écrit, c’est d’autant surprenant que c’est exactement ce que je cherchais à faire, pouvoir décomposer mon code jusqu’à arriver au résultat.
juste encore un truc, dans la ligne :

read -r -a pt <<< ${gt[$i]}

que signifie exactement <<<

(même si j’en ai une vague idée, je connais > , >> , <, mais <<< c’est la première fois que je le vois)

Bonjour

Dans cette ligne de commandes,
<<<
redirige vers le flux d’entrée de la commande read
la valeur de la variable contenue à l’index i du tableau gt

d’accord, excellent. Merci pour tout