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 15/08/2017, à 15: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 tongue ), 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 smile

Dernière modification par Hizoka (Le 16/08/2017, à 23:11)


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

Hors ligne

#2 Le 15/08/2017, à 15: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, à 15: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 résolu, 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.

En ligne

#4 Le 15/08/2017, à 15: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, à 16:12

Hizoka

Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande

Faisons plus simple, je me suis certainement mal expliqué smile

mmmhhh pas facile en fait tongue

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 smile )

Dernière modification par Hizoka (Le 15/08/2017, à 16:24)


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

Hors ligne

#6 Le 15/08/2017, à 16: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, à 16:34)

Hors ligne

#7 Le 15/08/2017, à 16: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, à 16: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.

Hors ligne

#9 Le 15/08/2017, à 16: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 tongue

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, à 16:47)


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

Hors ligne

#10 Le 15/08/2017, à 16: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, à 16: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 smile


Hizoka a écrit :

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, à 17:00)


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

Hors ligne

#12 Le 15/08/2017, à 16: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, à 16: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, à 17: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, à 17: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 smile )

Dernière modification par Watael (Le 15/08/2017, à 17:04)


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

Hors ligne

#16 Le 15/08/2017, à 17:07

Hizoka

Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande

pingouinux => en effet ça fonctionne smile

ç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, à 17: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, à 17: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, à 18: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, à 23: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... tongue


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

Hors ligne

#21 Le 17/08/2017, à 01: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, à 09: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 smile

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, à 09:23)


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

Hors ligne

#23 Le 17/08/2017, à 10: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, à 10:49)


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#24 Le 17/08/2017, à 13:59

Hizoka

Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande

Ca me parle plus comme ça pour comprendre smile

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 smile

Dernière modification par Hizoka (Le 17/08/2017, à 14:00)


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

Hors ligne

#25 Le 17/08/2017, à 21:02

melixgaro

Re : [Résolu mais dangereux] Renvoyer un tableau depuis une commande

Hizoka a écrit :

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