Die Variable "a=b"
enthält 1 Char 'a'
für den Namen und 1 Char 'b'
für den Wert.Wie viel Speicher benötigt eine Variable?
Zusammen 2 Bytes.
How many characters can you store with one byte ?
Die Variable muss einen Zeiger. 8 Bytes.
How many bytes do pointers take up ?
zusammen 10 Bytes.
Nimmt eine Variable "a=b"
, die im Speicher gespeichert ist, ungefähr 10 Bytes an? Und würden 10 Variablen der gleichen Größe etwa 100 Bytes benötigen?
Also 1000 Variablen von 1000 Bytes jeder wäre fast 1 MB Speicher?
Ich habe eine Datei data.sh, die nur Variablen enthält. Ich muss den Wert einer Variablen in dieser Datei abrufen. Ich mache das mit einer Funktion. (durch " 'function-name' 'Daten-Datei-Namen' 'Variablenname'" genannt)
#!/usr/pkg/bin/ksh93
readvar() {
while read -r line
do
typeset "${line}"
done < "${1}"
nameref indirect="${2}"
echo "${indirect}"
}
readvar datafile variable
Die Funktion liest die Datei data.sh Zeile für Zeile. Während dies geschieht, wird jede Zeile typisiert. Danach ist eine Namensreferenz von der Variable-Name im Funktionsaufruf zu einer der Variablen der Datei data.sh. Um schließlich den Wert dieser Variablen zu drucken.
Wenn die Funktion beendet ist, verbraucht sie keinen Speicher mehr. Aber so lange die Funktion läuft, tut es das.
Das bedeutet, dass alle Variablen in der Datei data.sh irgendwann im Speicher gespeichert sind.
Korrekt?
In Wirklichkeit habe ich eine Datei mit IP-Adressen als Variablenname und einen Kurznamen als Werte. Ich nehme an, dass dies kein Problem für die Erinnerung sein wird. Aber wenn ich dies auch für Besucherbeiträge verwende, werden variable Werte größer sein. Aber dann wäre es möglich, dass diese Funktion immer nur 10 Variablen im Speicher speichert. Allerdings frage ich mich, ob meine Art der Berechnung dieser Speichernutzung von Variablen sinnvoll ist.
Edit:
Dies könnte eine Lösung sein, zu vermeiden, dass die gesamte Datei in den Speicher zu laden.
#!/bin/ksh
readvar() {
input=$(print "${2}" | sed 's/\[/\\[/g' | sed 's/\]/\\]/g')
line=$(grep "${input}" "${1}")
typeset ${line}
nameref indirect="${2}"
print "${indirect}"
}
readvar ./test.txt input[0]
Mit dem Eingang test.txt
input[0]=192.0.0.1
input[1]=192.0.0.2
input[2]=192.0.0.2
und der Ausgang
192.0.0.1
Edit:
Natürlich !!! In der ursprünglichen Nachricht Bash read array from an external file es:
# you could do some validation here
so:
while read -r line
do
# you could do some validation here
declare "$line"
done < "$1"
Linien (oder setzen in KSH) erklärt würden unter einer Bedingung.
Ok, danke, ich denke, die folgende eine Lösung sein, kann es Ihre Art und Weise zu tun: '#/bin/ksh ReadVar() { Eingang = $ (print "$ {2}" | sed‚s!/\ [/ \\ [/ g '| sed' s/\]/\\]/g ') Zeile = $ (grep "$ {input}" "$ {1}") typeset $ { "$ {} indirekter" } ReadVar ./test.txt Eingang [0] 'mit Eingabedatei line} nameref indirekter = "$ {2}" Druck test.txt' Eingang [0] = 192,0 .0.1' Ausgabe: '192.0.0.1' :) – azbc