#1 Le 15/08/2017, à 14:22
- Hizoka
[Résolu mais dangereux] Renvoyer un tableau depuis une commande
Bonjour,
j'utilise une fonction qui me renvoie une liste via la création d'une variable que je peux réutiliser après.
Je souhaiterai convertir cette fonction en une "vraie" commande.
Mon soucis est de renvoyer une liste lorsque j'appelle la commande.
Afin que je comprenne bien, simplifions la commande (qui n'a que peu d’intérêt mais bon ), on lui entre des valeurs, elle crée une liste avec et ne la renvoie que partiellement (genre les clés 1 et 3) :
Il faudrait donc que :
variable=($(ma_super_commande oui non ouioui nononon))
# Crée une liste mais ne doit me renvoyer que :
# liste[1] qui vaut non
# liste[3] qui vaut nonnon
# Ainsi je devrais obtenir :
echo "${variable[@]}"
non nononon
echo "${!variable[@]}"
1 3
j'arrive à renvoyer les textes via des echo mais comment faire pour qu'au final j'ai une liste ?
Le but est bien évidemment qu'il n'y ait rien à faire pour l'utilisateur hormis appeler la fonction...
Merci à vous
Dernière modification par Hizoka (Le 16/08/2017, à 22:11)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 15/08/2017, à 14:48
- pingouinux
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Bonjour Hizoka,
Je ne suis pas sûr d'avoir bien compris ce que tu voulais.
À tout hasard
ma_super_commande() { echo "$2" "$4"; }
variable=($(ma_super_commande oui non ouioui nononon))
echo "${variable[@]}"
echo "${!variable[@]}"
qui donne ce résultat
non nononon
0 1
Hors ligne
#3 Le 15/08/2017, à 14:50
- erresse
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Salut Hizoka,
Puisque ta variable est censée constituer une liste, la seule réception des données en retour de ta "ma_super_commande" devraient donc être des éléments de cette liste, non ?
Qu'est-ce qui ne fonctionne pas dans cet exemple ?
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#4 Le 15/08/2017, à 14:57
- pingouinux
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Autre suggestion, avec l'introduction d'un "no-break space", mais les indices ne sont pas bons non plus :
ma_super_commande() { echo $'\xc2\xa0' "$2" $'\xc2\xa0' "$4"; }
variable=($(ma_super_commande oui non ouioui nononon))
echo "${variable[@]}"
echo "${!variable[@]}"
non nononon
0 1 2 3
Hors ligne
#5 Le 15/08/2017, à 15:12
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Faisons plus simple, je me suis certainement mal expliqué
mmmhhh pas facile en fait
imaginons qu'un script fait tout un travail et doit me renvoyer un tableau :
# Il contient 2 valeurs
echo ${Tableau[@]}
oui non
# il contient 2 clés mais pas 0 et 1 forcement...
echo ${!Tableau[@]}
0 5
Je voudrais lorsque je fais appel à ce script que je puisse avoir les même valeurs :
x=($(ma_commande))
echo ${x[@]}
oui non
echo ${!x[@]}
0 5
je ne veux pas (ou vraiment éviter) devoir faire un truc du genre :
x=()
while IFS+=":" read num elem
do
# La commande renvoie un truc du genre : Numero:Valeur, et l'utilisateur recrée un tableau après
x[${num}]="${elem}"
done < <(ma_super_commande)
Ce qui fonctionne (ça me renvoie bien un tableau identique à celui de la commande) mais demande des traitements post commande.
Mais plus ça va, moins j'ai l'impression que ce soit possible...
En gros, tout mon probleme est de conserver les clés du tableau (car oui si je ne conserve que les valeurs, c'est facile )
Dernière modification par Hizoka (Le 15/08/2017, à 15:24)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 15/08/2017, à 15:34
- pingouinux
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Si ma_super_commande génère un tableau, tu peux la faire exécuter dans le shell courant, et tu récupères directement le tableau.
ma_super_commande() { ..... }
# au lieu de
ma_super_commande() ( ..... )
Dernière modification par pingouinux (Le 15/08/2017, à 15:34)
Hors ligne
#7 Le 15/08/2017, à 15:35
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Peux tu me donner un exemple s'il te plait ?
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 15/08/2017, à 15:37
- Watael
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
salut,
si je comprends ce que tu veux faire, ce n'est pas possible.
tu voudrais passer des ensembles pour que l'utilisateur n'est pas à découper la sortie.
mais il faudra de toute manière qu'il "désassemble" ces ensembles pour en rendre chaque élément disponible.
donc, que tu lui passes des "ensembles" (ce qui n'est pas possible), ou une liste d'éléments distincts, l'utilisateur devra reconstituer les informations dans un format qu'il pourra ensuite utiliser.
le plus simple est peut-être de présenter les informations au format CSV :
1,info1
3,info3
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#9 Le 15/08/2017, à 15:40
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Merci Watael, oufff quelqu'un qui ma compris XD
et comme je le pensais ce n'est pas possible...
c'est pour ça qu'actuellement ma commande me renvoie :
1:info1
3:info3
que je coupe et rassemble dans un tableau coté utilisateur.
Dommage en python c'est plus simple
Mais du coup, est-il possible de partager la variable Tableau créée par ma commande ? Genre :
ma_commande
echo ${Tableau[@]}
Car c'est ce que je fais avec la version fonction de ma commande.
Mais j'arrive pas à exporter la variable Tableau créée depuis ma commande pour l'utiliser dans le shell courant.
Dernière modification par Hizoka (Le 15/08/2017, à 15:47)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 15/08/2017, à 15:47
- pingouinux
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Peux tu me donner un exemple s'il te plait ?
declare -A tablo
ma_super_commande() { tablo[$1]="$2"; tablo[$3]="$4"; }
ma_super_commande 0 oui 5 non
echo "${tablo[@]}"
echo "${!tablo[@]}"
qui donne ceci
oui non
0 5
Hors ligne
#11 Le 15/08/2017, à 15:50
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Ha non, on est pas du tout dans ce que je cherche pingouinux (car je ne connais jamais le numéro des elements du tableau lors du lancement de la commande)...
J'avais peut être mal compris :
declare -A MULTIVALUE
./multiselect oui non caca cacaccccc
0) oui
1) non
2) caca
3) cacaccccc
Sélection : 0 1
# Le script fait : MULTIVALUE[${x}]="${y}"
# Dans le shell courant
echo ${MULTIVALUE[@]}
# Ne renvoie rien
J'aurais bien aimé que ça fonctionne ça
Mais du coup, est-il possible de partager la variable Tableau créée par ma commande ? Genre :
ma_commande echo ${Tableau[@]}
Car c'est ce que je fais avec la version fonction de ma commande (je lance la fonction est j'utilise la variable créée par celle-ci après, un peu comme REPLY je pense)
Mais j'arrive pas à exporter la variable Tableau créée depuis ma commande pour l'utiliser dans le shell courant.
Dernière modification par Hizoka (Le 15/08/2017, à 16:00)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 15/08/2017, à 15:58
- pingouinux
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Il faut déclarer Tableau avant d'appeler la fonction.
Hors ligne
#13 Le 15/08/2017, à 15:59
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Oui c'est ce que j'ai fait, look mon edit.
C'est par ça que j'avais commencé mais je suis parti sur autre chose après coup...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#14 Le 15/08/2017, à 16:00
- pingouinux
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
./multiselect oui non caca cacaccccc
Si ta fonction est dans un autre script, essaye comme ceci
. ./multiselect oui non caca cacaccccc
Hors ligne
#15 Le 15/08/2017, à 16:01
- Watael
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Dommage en python c'est plus simple
en python, tu peux passer, d'un script à un autre, des tableaux en tant que tels ?
sinon, peut-être peux-tu sourcer le premier script pour rendre le tableau disponible dans le second...
? (grilled by Pingouinux )
Dernière modification par Watael (Le 15/08/2017, à 16:04)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#16 Le 15/08/2017, à 16:07
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
pingouinux => en effet ça fonctionne
ça s’éloigne de l'idée que j'avais en tête car au final j'en reviens à utiliser une fonction quoi...
et surtout il n'est plus possible d'utiliser getopts pour passer des arguments.
En tout cas, merci à vous pour le temps passer !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#17 Le 15/08/2017, à 16:09
- nam1962
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Et avec column ?
man column
Exemple :
ma_super_commande > ~/Documents/msc.txt
cat ~/Documents/msc.txt | column -t
[ Modéré ]
Hors ligne
#18 Le 15/08/2017, à 16:19
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
merci nam1962, mais je vais resté dans ce que je fais actuellement car dans tous les cas il faut un traitement par l'utilisateur et j'aime autant éviter de passer par des fichiers tiers.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#19 Le 15/08/2017, à 17:04
- nam1962
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Tu peux aussi :
ma_super_commande | column -t
(ou autre argument de la fonction column)
[ Modéré ]
Hors ligne
#20 Le 16/08/2017, à 22:10
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
On m'a proposé une solution qui va pas plaire à Watael XD
titi() { echo "[0]='oui' [5]='non'" ;}
eval x=($(titi))
echo ${x[@]}
oui non
echo ${!x[@]}
0 5
J'avais pensé à eval à un moment mais mon subconscient ma dit : eval, c'est mal !
comme quoi à force de répéter ça rentre...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#21 Le 17/08/2017, à 00:42
- melixgaro
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
salut,
et ça ?
#!/bin/bash
mycommand () {
local _table_obj="${1}"
shift
declare -n _p=${_table_obj}
idx=0
while [[ $# -gt 0 ]]
do
idx=$((idx + 1))
declare -g _p[${idx}]="${1}"
shift
done
}
table_obj="matable"
declare -Ag ${table_obj}
mycommand matable info1 info2
echo ${matable[@]}
echo ${!matable[@]}
echo ${#matable[@]}
(le premier argument de ta_super_commande est le nom du tableau, les argument n>1 sont les éléments du tableau)
Résultat :
$ ./return_table.sh
info1 info2
1 2
2
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#22 Le 17/08/2017, à 08:21
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Salut,
j'ai pas tout pigé pour le coup, je maîtrise pas les declares et les shifts.
Peux tu apporter une petite explication ?
Sinon ça semble fonctionner en effet
mycommand () {
local _table_obj="${1}" # Mais pourquoi est-il en local et à quoi ça sert ?
shift
declare -n _p=${_table_obj} # Lien vers _table_obj
declare -g _p[8]="valeur 8" # Declaration en mode global
shift
declare -g _p[12]="valeur 12" # Declaration en mode global
shift
declare -g _p[2]="valeur 2" # Declaration en mode global
shift
}
Dernière modification par Hizoka (Le 17/08/2017, à 08:23)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#23 Le 17/08/2017, à 09:42
- melixgaro
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
salut,
voici une version modifiée qui marche aussi
#!/bin/bash
mycommand () {
declare -n _p="${1}" # on crée un (genre de) « pointeur »
shift # on décale les arguments d'un cran car arg#1 = nom du tableau, arg#n>1 = éléments du tableau
idx=0
while [[ $# -gt 0 ]] # on boucle sur les arguments et on les ajoute un à un au tableau
do
idx=$((idx + 1)) # le premier élément aura l'indice 1
_p[${idx}]="${1}"
shift
done
}
table_obj="matable"
declare -Ag ${table_obj} # on déclare un tableau associatif (associative array)
mycommand matable info1 info2 info3
echo ${matable[@]}
echo ${!matable[@]}
echo ${#matable[@]}
Dernière modification par melixgaro (Le 17/08/2017, à 09:49)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#24 Le 17/08/2017, à 12:59
- Hizoka
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Ca me parle plus comme ça pour comprendre
En effet c'est sympa.
mycommand () {
declare -n _p="${1}"
_p[8]="valeur 8"
_p[12]="valeur 12"
_p[2]="valeur 2"
}
declare -Ag table_obj="matable"
mycommand matable
echo ${matable[@]}
echo ${!matable[@]}
echo ${#matable[@]}
Mais pour que ça fonctionne comme une commande "normale", on en arrive qu'il faut sourcer le fichier.
. mycommand matable
Dans tous les cas, merci pour ces connaissances
Dernière modification par Hizoka (Le 17/08/2017, à 13:00)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#25 Le 17/08/2017, à 20:02
- melixgaro
Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande
Mais pour que ça fonctionne comme une commande "normale", on en arrive qu'il faut sourcer le fichier.
. mycommand matable
je ne comprends pas ce que tu veux dire. Dans l'exemple donné, la fonction se comporte comme une fonction… normale. Que veux-tu dire par « commande normale » ?
Linux depuis ~2007. Xubuntu seulement.
Hors ligne