bash Linux: affectation de variables multiples
-
21-09-2019 - |
Question
existe dans bash linux quelque chose de similaire au code suivant en PHP:
list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
i.e.. vous assignez dans une phrase, une valeur correspondant à 3 variables différentes.
Disons que j'ai la myBashFuntion
fonction bash qui écrit à stdout la chaîne « qwert xdr zxcvb ».
Est-il possible de faire quelque chose comme:
(var1 var2 var3) = ( `myBashFuntion param1 param2` )
La partie à gauche du signe égal n'est pas une syntaxe valide bien sûr. Je suis juste essayer d'expliquer ce que je demande.
Qu'est-ce que le travail, cependant, est la suivante:
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 pouvais faire:
var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}
Mais ce sont 3 autres déclarations que je préfèrerais éviter.
Je suis à la recherche d'une syntaxe raccourci. Est-il possible?
La solution
La première chose qui me vient à l'esprit:
read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"
sortie est, sans surprise
1|2|3
Autres conseils
Je voulais assigner les valeurs à un tableau. Alors, l'extension Michael approche Krelin , je l'ai fait:
read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"
ce qui donne:
2|4|6
comme prévu.
Je pense que cela pourrait aider ...
Pour briser l'utilisateur entré dates dans mes scripts (mm / jj / aaaa), je magasin le jour, le mois et l'année dans un tableau, puis mettre les valeurs en 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]}`)
Parfois, vous devez faire quelque chose funky. Disons que vous voulez lire à partir d'une commande (l'exemple par date SDGuero par exemple), mais vous voulez éviter de multiples fourches.
read month day year << DATE_COMMAND
$(date "+%m %d %Y")
DATE_COMMAND
echo $month $day $year
Vous pouvez également tuyau dans la commande de lecture, mais alors vous devez utiliser les variables dans 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ésultats dans ...
13 08 2013
n/a n/a n/a
Chapitre 5 du Bash livre de recettes par O'Reilly, discute (longuement) les raisons de l'exigence d'une affectation de variable qu'il n'y ait pas d'espace autour de panneau « = »
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 valable).
Tout cela semble un peu comme justifiant après l'événement, mais en tout cas il n'y a aucune mention d'une méthode d'attribution à une liste de variables.