Definieren Sie einen lokalen Arrays in einem bash-Funktion und der Zugang außerhalb dieser Funktion
Ich versuche das definieren eines lokalen Arrays in einem bash-Funktion und der Zugang außerhalb der Funktion.
Merke ich, dass BASH-Funktionen keine Werte zurückgeben, aber ich kann weisen die Ergebnisse einer Berechnung zu einem globalen Wert. Ich erwartet, dass dieser code auf der echo-Inhalt von array [], um den Bildschirm. Ich bin mir nicht sicher, warum seine scheitern.
function returnarray
{
local array=(foo doo coo)
#echo "inside ${array[@]}"
}
targetvalue=$(returnarray)
echo ${targetvalue[@]}
- Was bedeutet es zu sagen? Haben Sie this "Thema". Vielleicht sind Sie fehlen () nach dem Funktionsnamen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei Möglichkeiten. Das erste ist, was @choroba schreibt, und es ist wahrscheinlich das beste und einfachste: nicht definieren, das array local.
Dies ist ordentlich, einfach, sicher, vollständig vermeidet die Verwendung von subshells (es ist also effizienter). Es hat eine Einschränkung, aber: es funktioniert nicht mit dünnbesetzten arrays (aber dies sollte ein kleines detail). Gibt es einen anderen winzigen Nachteil: das array kopiert werden muss.
Andere Möglichkeit ist der pass den Namen einer Variablen an die Funktion, und die Funktion haben, generieren Sie das array direkt. Dies nutzt namerefs und ist nur vorhanden, da die Bash 4.3 (aber es ist wirklich gut—verwenden Sie es, wenn Sie können!):
Um die variable von außen zugänglich, deklarieren Sie Sie nicht
local
. Machen Sie es global.Erste, wie du sagst, es gibt keine Rückgabewerte von bash-Funktionen. Also ist der einzige Weg, um pass ein lokaler Wert ist
echo
es.Dies würde jedoch dazu führen, dass dein Zielwert mit alles, was Sie hallte in index 0, wenn interpretiert als ein array. Zu sagen, der bash zu behandeln, die Teile als array teilen, müssen Sie Sie umgeben von Klammern - aus der bash-manual:
Jedoch, all dies ist wirklich die Programmierung um, wie
bash
funktioniert. Es wird besser sein, definieren Sie Ihre arrays Global.Als die Verwendung von
echo
macht bash interpretieren Sie die Werte, das nur funktioniert, wenn die Werte des Arrays sind nicht betroffen von der bash, zum Beispiel können die Werte nicht enthalten, Platzhalter oder Leerstellen, Platzhaltern würde erweitert werden, um die passenden Dateien und Räume in einen Wert übersetzt in mehrere array-Werte.set -f
zu deaktivieren pathname expansion. Dann, in Bezug auf die Räume, werden Sie etwas verrücktes tun, wie die EinstellungIFS=$'\n'
und stattecho "${array[@]}"
verwenden würdeprintf '%s\n' "${array[@]}"
. Dann, nachdem er darauf hingewiesen, dass es bricht immer noch mit Zeilenumbrüche in Feldern, Sie werden entweder aufgeben (das passiert aber nur mit intelligenten Menschen) oder behaupten, dass es eher unwahrscheinlich ist, oder verwendenprintf
mit%q
gefolgt von einemeval
.Blick auf diese, es wäre ok, mit Leerzeichen und andere Zeichen....
Sehen Wie die Rückkehr eines Arrays in der bash ohne Verwendung von globals?
Edit: den Kommentar über 'array', war richtig... hier ist eine korrigierte version. sed Verwendung I dont mind...
sed
: wennarray
erscheint in jedem Feld des Arrays, gibt es Probleme... und es ist eine hässliche Lösung, da es nicht Reine Bash:)
.Können Sie lokale Variablen deklarieren, und dann printf Komma-separated-value string, der konvertiert schön in ein array. Der Schlüssel ist die Verwendung von printf () statt echo.
http://wiki.bash-hackers.org/commands/builtin/read :
Code:
Terminal: