web-dev-qa-db-fra.com

Linux bash: affectation de variables multiples

Existe-t-il dans linux bash quelque chose de similaire au code suivant en PHP:

list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;

c'est-à-dire que vous attribuez en une phrase une valeur correspondante à 3 variables différentes.

Disons que j'ai la fonction bash myBashFuntion qui écrit sur la sortie standard la chaîne "qwert asdfg zxcvb". Est-il possible de faire quelque chose comme:

(var1 var2 var3) = ( `myBashFuntion param1 param2` )

La partie à gauche du signe égal n'est bien sûr pas une syntaxe valide. J'essaie juste d'expliquer ce que je demande.

Qu'est-ce qui fonctionne, cependant, est le suivant:

array = ( `myBashFuntion param1 param2` )
echo ${array[0]} ${array[1]} ${array[2]}

Mais un tableau indexé n'est pas aussi descriptif que les noms de variables simples.
Cependant, je pourrais juste faire:

var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}

Mais ce sont 3 autres déclarations que je préférerais éviter.

Je cherche juste une syntaxe de raccourci. C'est possible?

101
GetFree

La première chose qui me vient à l’esprit:

read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"

la sortie est, sans surprise

1|2|3
195

Je voulais assigner les valeurs à un tableau. Donc, en prolongeant approche de Michael Krelin , j'ai:

read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"

qui donne:

2|4|6 

comme prévu.

15
soundray

Je pense que cela pourrait aider ...

Afin de décomposer les dates entrées par l'utilisateur (mm/jj/aaaa) dans mes scripts, je stocke le jour, le mois et l'année dans un tableau, puis je mets les valeurs dans des variables distinctes, comme suit:

DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)
4
SDGuero

Parfois, vous devez faire quelque chose de génial. Supposons que vous souhaitiez lire une commande (par exemple, la date, par SDGuero), mais que vous souhaitiez éviter les forks multiples.

read month day year << DATE_COMMAND
 $(date "+%m %d %Y")
DATE_COMMAND
echo $month $day $year

Vous pouvez également diriger vers la commande de lecture, mais vous devrez alors utiliser les variables d'un sous-shell:

day=n/a; month=n/a; year=n/a
date "+%d %m %Y" | { read day month year ; echo $day $month $year; }
echo $day $month $year

résulte en...

13 08 2013
n/a n/a n/a
3
Otheus

Le chapitre 5 du Bash Cookbook de O'Reilly explique (de manière assez détaillée) les raisons de l'exigence, dans une affectation de variable, de ne pas laisser d'espaces autour du signe '='

MYVAR="something"

L'explication a quelque chose à voir avec la distinction entre le nom d'une commande et une variable (où '=' peut être un argument valide).

Tout cela ressemble un peu à une justification après l'événement, mais dans tous les cas, il n'est pas fait mention d'une méthode d'attribution à une liste de variables.

0
pavium