Antworten:
VAR=$(scan)
Genau so wie bei Programmen.
Sie können Bash-Funktionen in Befehlen / Pipelines verwenden, da Sie sonst reguläre Programme verwenden würden. Die Funktionen sind auch für Unterschalen und transitiv verfügbar. Befehlsersetzung:
VAR=$(scan)
Ist der einfachste Weg, um in den meisten Fällen das gewünschte Ergebnis zu erzielen. Ich werde im Folgenden Sonderfälle skizzieren.
Beibehaltung nachfolgender Zeilenumbrüche:
Eine der (normalerweise hilfreichen) Nebenwirkungen der Befehlsersetzung besteht darin, dass eine beliebige Anzahl nachfolgender Zeilenumbrüche entfernt wird. Wenn nachgestellte Zeilenumbrüche beibehalten werden sollen, kann ein Dummy-Zeichen an die Ausgabe der Unterschale angehängt und anschließend mit Parametererweiterung entfernt werden.
function scan2 () {
local nl=$'\x0a'; # that's just \n
echo "output${nl}${nl}" # 2 in the string + 1 by echo
}
# append a character to the total output.
# and strip it with %% parameter expansion.
VAR=$(scan2; echo "x"); VAR="${VAR%%x}"
echo "${VAR}---"
Drucke (3 Zeilenumbrüche):
output
---
Verwenden Sie einen Ausgabeparameter: Vermeiden der Unterschale (und Beibehalten von Zeilenumbrüchen)
Wenn die Funktion versucht, einen String in eine Variable mit bash v4.3 und höher "zurückzugeben", kann man das verwenden, was als a bezeichnet wird nameref
. Mit Namerefs kann eine Funktion den Namen einer oder mehrerer Variablenausgabeparameter übernehmen. Sie können einer nameref-Variablen Dinge zuweisen, und es ist, als hätten Sie die Variable geändert, auf die sie verweist.
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}==="
Drucke:
output
===
Diese Form hat einige Vorteile. Es ermöglicht Ihrer Funktion nämlich, die Umgebung des Aufrufers zu ändern, ohne überall globale Variablen zu verwenden.
Hinweis: Die Verwendung von namerefs kann die Leistung Ihres Programms erheblich verbessern, wenn Ihre Funktionen stark von Bash-Buildins abhängen, da die Erstellung einer Subshell vermieden wird, die unmittelbar danach weggeworfen wird. Dies ist im Allgemeinen sinnvoller für kleine Funktionen, die häufig wiederverwendet werden, z. B. Funktionen, die auf endenecho "$returnstring"
Dies ist relevant. https://stackoverflow.com/a/38997681/5556676
Ich denke, init_js sollte deklarieren anstelle von lokal verwenden!
function scan3() {
declare -n outvar=$1 # -n makes it a nameref.
local nl=$'\x0a'
outvar="output${nl}${nl}" # two total. quotes preserve newlines
}
local
eingebaute System akzeptiert alle Optionen, die das declare
eingebaute System akzeptiert. Aus einem Schnelltest geht auch hervor, dass declare -n
in einem Funktionsbereich auch die Variable local scope angegeben ist. es scheint, dass sie hier austauschbar sind.