itérer sur un nom de variable (script bash) Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4903
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Bonjour, je bloque sur un truc qui va vous sembler tout bête.
J'ai une série de variables qui s'appellent
entrée_1
entrée_2
....
entrée_20

Je dois faire le même traitement sur chaque d'elles donc une boucle FOR s'impose.
Mais comment itérer sur un morceau de nom ?
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonjour

Un nom de variable dans lequel il y a une lettre accentuée, ça va pas le faire dans bash,
mais sans le caractère accentué, tu pourrais faire :

Code : Tout sélectionner

for numero in {1..20}; do 
    nomVar="entree_$numero"
    echo "Valeur de $nomVar : ${!nomVar}"
done
Mais il y a peut-être une autre méthode que je ne connais pas encore…
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4903
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

l n'y a pas de é , c'était juste pour l'exemple. Ce sont en réalité les noms des ports de connexion de ma carte son dans Jack. J'ai un script pour faire les connexions/deconnexions automatiquement en début de session
Je ne pensais pas que un truc aussi simple fonctionnerai! je vais tester
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4903
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

ça fonctionne parfaitement, merci!
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3546
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

MicP a écrit : 24 nov. 2022, 04:26${!nomVar}
Est-ce que ça fonctionne dans tous les contextes ?

Car jusqu'à présent j'ai utilisé une fonction pompée dans les scripts ./play.it que vv222 a eu la gentillesse de me montrer,
mais c'est beaucoup plus compliqué, d'ailleurs j'ai déjà oublié les subtilités de son fonctionnement.

Code : Tout sélectionner

####	FONCTION	#############
#
# get the value of a variable and print it
# USAGE: get_value "variable_name"  (sans $)
get_value ()
{
	local name ;
	local value ;
	name="$1" ;
	value="$(eval printf -- '%b' \"\$$name\")" ;
	printf '%s' "$value" ; 
	#echo "$name vaut $value" ;		# test temporaire #
}
#
#################################
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3546
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Je vais m'auto-répondre en partie : :rtfm:

$ man --pager='less -p "^\s+Parameter Expansion"' bash

J'admets avoir de très grosses lacunes :blush:
**Simple Utilisateur** -- Debian stable - XFCE
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonjour

Pour pouvoir visualiser la page du manuel de bash dans sa version non traduite concernant le Remplacement des paramètres :

Code : Tout sélectionner

LANG=C man --pager='less -p "^\s+Parameter Expansion"' bash
Si votre compte utilisateur a été paramétré (voir la commande locale) pour utiliser le français
pour pouvoir visualiser la page du manuel de bash dans sa version traduite en français concernant le Remplacement des paramètres :

Code : Tout sélectionner

man --pager='less -p "Remplacement des paramètres$"' bash
Avatar de l’utilisateur
vv222
Membre actif
Membre actif
Messages : 852
Inscription : 18 avr. 2016, 20:14
Contact :
Status : Hors-ligne

L’approche proposée par MicP est beaucoup plus simple, mais nécessite l’utilisation de Bash.

Celle que j’utilise avec ./play.it est plus complexe (il faut passer par une fonction dédiée) mais devrait fonctionner avec toutes les implémentations de /bin/sh.

Pour info, la version actuelle du code partagé par dezix :

Code : Tout sélectionner

# expand the given variable name and print its value
# USAGE: get_value $variable_name
# RETURN: the variable value
get_value() {
	local variable_name
	variable_name="$1"

	if ! variable_is_set "$variable_name"; then
		error_variable_not_set "$variable_name"
		return 1
	fi

	eval printf -- '%b' \"\$"${variable_name}"\"
}
(source)

Le test variable_is_set est détaillé dans la source donnée en lien, et peut être omis si on ne bosse pas avec set -o nounset.
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Effectivement, j'avais répondu à la question posée dans ce fil de discussion dont le titre est : itérer sur un nom de variable (script bash)
donc, en utilisant l'interpréteur de commande /bin/bash

Mais si la proposition de solution faite par vv222 semble plus complexe
elle a pour avantage de pouvoir fonctionner aussi bien avec /bin/bash
qu'avec /bin/sh qui, sur debian (et Ubuntu) est un lien vers /bin/dash

Code : Tout sélectionner

mic@deb116:~$ which sh
/usr/bin/sh
mic@deb116:~$ ls -l /usr/bin/sh
lrwxrwxrwx 1 root root 4  5 janv. 13:03 /usr/bin/sh -> dash
mic@deb116:~$ 
Répondre