Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/07/2016, à 17:03

lynn

Tableau en bash

Bonjour,

VAR=02
LIST=(00 01 02 03 04 05)
[[ "$var" = "${LIST[@]}" ]] && echo "$var fait partie de la liste";

Je traduis la dernière ligne comme ça: Si la variable "var" est égale à un des éléments contenus dans le tableau "LIST", alors on affiche "02 fait partie de la liste" et si aucun élément ne correspond, alors on affiche rien...
Ma traduction n'a pas l'air d'être la bonne puisque ça n'affiche rien...

Quelqu'un peut-il me donner un début d'explication? Merci.


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#2 Le 27/07/2016, à 17:18

pingouinux

Re : Tableau en bash

Bonjour,

for elem in "${LIST[@]}"
do
   [[ $var = $elem ]] && { echo "$var fait partie de la liste"; break; }
done

Et aussi, var est différent de VAR.

Hors ligne

#3 Le 27/07/2016, à 17:46

lynn

Re : Tableau en bash

Ah ok, il faut faire une boucle sur les éléments du tableau et ensuite comparer les valeurs...

Pour var et VAR, c'est une erreur de copie de ma part...

Merci pingouinux.


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#4 Le 27/07/2016, à 17:53

Hizoka

Re : Tableau en bash

ou ça aussi (pingouinux dira si je me suis planté tongue )

VAR=02
LIST=(00 01 02 03 04 05)
[[ $(grep -w "${VAR}" <<< "${LIST[@]}") ]] && echo "${VAR} fait partie de la liste"
# 02 fait partie de la liste

VAR=09
LIST=(00 01 02 03 04 05)
[[ $(grep -w "${VAR}" <<< "${LIST[@]}") ]] && echo "${VAR} fait partie de la liste"

Dernière modification par Hizoka (Le 27/07/2016, à 17:54)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#5 Le 27/07/2016, à 17:59

Watael

Re : Tableau en bash

salut,

$ VAR=02
$ LIST=(00 01 02 03 04 05)
$ (IFS='|'; reg="^(${LIST[*]})$"; [[ $VAR =~ $reg ]] && echo OK || echo ko)
OK
$
$ LIST=(00 01 2 03 04 05)
$ (IFS='|'; reg="^(${LIST[*]})$"; [[ $VAR =~ $reg ]] && echo OK || echo ko)
ko
$
$ LIST=(00 01 03 04 05)
$ (IFS='|'; reg="^(${LIST[*]})$"; [[ $VAR =~ $reg ]] && echo OK || echo ko)
ko
$

les commandes sont exécutées dans un sous-shell pour ne pas "polluer" l'IFS de l'environnement courant.

Dernière modification par Watael (Le 27/07/2016, à 18:00)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 27/07/2016, à 18:12

pingouinux

Re : Tableau en bash

@Hizoka #4 : Ça marche aussi mais tu peux simplifier

grep -qw "${VAR}" <<< "${LIST[@]}" && echo "${VAR} fait partie de la liste"

Hors ligne

#7 Le 27/07/2016, à 18:17

lynn

Re : Tableau en bash

Bon, bah y' a vraiment moyen de faire quelque chose. Merci à vous tous pour vos suggestions. big_smile

@Watel
Pour mon inculture personnelle, si tu pouvais détailler un peu cette partie

reg="^(${LIST[*]})$"

«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#8 Le 27/07/2016, à 18:28

lynn

Re : Tableau en bash

Comme je suis dans les tableaux, j'ai une question subsidiaire sur la façon de former la liste des éléments. tongue

Est-il possible que LIST prenne cette forme LIST=(01 à 12) plutôt que cette forme LIST=(01 02 03 04 05 06 07 08 09 10 11 12) et si oui, quelle est la syntaxe à utiliser?


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#9 Le 27/07/2016, à 18:31

pingouinux

Re : Tableau en bash

LIST=( {01..12} )

Hors ligne

#10 Le 27/07/2016, à 18:33

k3c

Re : Tableau en bash

si tu fais

man seq

tu as au début

SEQ(1)                                                                               User Commands                                                                               SEQ(1)

NAME
       seq - print a sequence of numbers

SYNOPSIS
       seq [OPTION]... LAST
       seq [OPTION]... FIRST LAST
       seq [OPTION]... FIRST INCREMENT LAST

DESCRIPTION
       Print numbers from FIRST to LAST, in steps of INCREMENT.

       Mandatory arguments to long options are mandatory for short options too.

Archlinux sur Xiaomi Air 13

Hors ligne

#11 Le 27/07/2016, à 19:20

Watael

Re : Tableau en bash

reg="^(${LIST[*]})$"

cette "commande" construit une regex qui sera ensuite utilisée dans le test amélioré [[ avec l'opérateur de regex (!) =~
il est préférable de toujours mettre les regex, qui seront utilisées dans le test amélioré, dans une variable : ça évite entre autre les problème d'interprétation des guillemets.

exécute le sous-shell en ajoutant

set -x

au début,
et

set +x

à la fin.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 27/07/2016, à 19:40

lynn

Re : Tableau en bash

Merci à tous pour toutes vos précisions...


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne