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 stdout 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.
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 simplement 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?
read -d "\n" v1 v2 <<<$(cmd)
fonctionne parfaitement. Je vous remercie!echo
est inutile, mais j'utilisais cette technique pour renvoyer plusieurs valeurs à partir d'un script dont je me souciais du statut de retour. J'ai pensé partager mes découvertes.read -r
:do not allow backslashes to escape any characters
Je voulais attribuer les valeurs à un tableau. Donc, prolongeant l'approche de Michael Krelin , j'ai fait:
ce qui donne:
comme prévu.
la source
a=( $(echo 2 4 6) ) ; echo ${a[0]} ${a[1]} ${a[2]}
read -r
:do not allow backslashes to escape any characters
Je pense que cela pourrait aider ...
Afin de décomposer les dates saisies 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 séparées comme suit:
la source
IFS=/ read -r m d y < <(echo 12/29/2009)
Parfois, vous devez faire quelque chose de génial. Supposons que vous souhaitiez lire à partir d'une commande (l'exemple de date de SDGuero par exemple) mais que vous souhaitiez éviter les fourchettes multiples.
Vous pouvez également accéder à la commande read, mais vous devrez ensuite utiliser les variables dans un sous-shell:
résulte en...
la source
read
commande ne se produit pas dans un sous-shell à cause des accolades, c'est parce que vous avez la commande read sur le côté droit du tube. Vous devez exécuter laread
commande dans le shell actuel, ce que vous pouvez faire commeread day month year <<< `date "+%d %m %Y"`
read
cela se produit, mais la portée des variables dans lesquelles il lit tombe hors de portée lorsque le sous-shell du pipeline se termine.Le chapitre 5 du livre de recettes Bash d'O'Reilly discute (assez longuement) des raisons de l'exigence dans une affectation de variable qu'il n'y ait pas d'espace autour du signe '='
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 en tout cas il n'y a aucune mention d'une méthode d'affectation à une liste de variables.
la source
;
» est un argument valable? Quand j'écrisls ; cd
ça appelle encorels
etcd
malgré les espaces. Si je veux lister les répertoires appelés;
et quecd
je peux simplement taperls ';' cd
.