Comment atsortingbuer la sortie d’une fonction à une variable en utilisant bash?

J’ai une fonction bash qui produit des résultats:

function scan { echo "output" } 

Comment atsortingbuer cette sortie à une variable?

c’est à dire. VAR = scan (bien sûr, cela ne fonctionne pas – cela fait que VAR est égal à la chaîne “scan”)

 VAR=$(scan) 

Exactement la même manière que pour les programmes.

Vous pouvez utiliser les fonctions bash dans les commandes / pipelines car vous utiliseriez des programmes ordinaires. Les fonctions sont également disponibles pour les sous-couches et de manière transitoire, Substitution de commandes:

 VAR=$(scan) 

Est-ce le moyen simple d’obtenir le résultat souhaité dans la plupart des cas. Je décrirai les cas particuliers ci-dessous.

Préserver les nouvelles lignes:

Un des effets secondaires (généralement utiles) de la substitution de commandes est qu’elle supprime tout nombre de nouvelles lignes. Si l’on souhaite conserver les nouvelles lignes de fin, on peut append un caractère factice à la sortie du sous-shell, puis le dépouiller avec l’extension du paramètre.

 function scan2 () { local nl=$'\x0a'; # that's just \n echo "output${nl}${nl}" # 2 in the ssortingng + 1 by echo } # append a character to the total output. # and ssortingp it with %% parameter expansion. VAR=$(scan2; echo "x"); VAR="${VAR%%x}" echo "${VAR}---" 

estampes (3 nouvelles lignes conservées):

 output --- 

Utiliser un paramètre de sortie: éviter le sous-shell (et préserver les nouvelles lignes)

Si ce que la fonction essaie de faire est de “retourner” une chaîne dans une variable, avec bash v4.3 et plus, on peut utiliser ce qu’on appelle un nameref . Namerefs permet à une fonction de prendre le nom d’un ou plusieurs parameters de sortie de variables. Vous pouvez affecter des choses à une variable nameref et c’est comme si vous changiez la variable “pointe vers / références”.

 function scan3() { local -n outvar=$1 # -n makes it a nameref. local nl=$'\x0a' outvar="output${nl}${nl}" # two total. quotes preserve newlines } VAR="some prior value which will get overwritten" # you pass the name of the variable. VAR will be modified. scan3 VAR # newlines are also preserved. echo "${VAR}===" 

estampes:

 output === 

Ce formulaire présente quelques avantages. A savoir, cela permet à votre fonction de modifier l’environnement de l’appelant sans utiliser les variables globales partout.

Remarque: l’utilisation de namerefs peut grandement améliorer les performances de votre programme si vos fonctions reposent largement sur les fonctions intégrées bash, car cela évite la création d’un sous-shell qui est jeté juste après. Cela a généralement plus de sens pour les petites fonctions réutilisées souvent, par exemple les fonctions se terminant par echo "$returnssortingng"

Ceci est pertinent. https://stackoverflow.com/a/38997681/5556676

Je pense que init_js devrait utiliser declare au lieu de local!

 function scan3() { declare -n outvar=$1 # -n makes it a nameref. local nl=$'\x0a' outvar="output${nl}${nl}" # two total. quotes preserve newlines }