Bandbreite anzeigen

Die aktuell genutzte Bandbreite eines Linux Systems wird ermittelt als übertragene Bytes pro Zeitabstand. Einen „aktuellen“ Wert zum Auslesen gibt es nicht, man muss also die Bandbreite aus zwei Deltawerten übertragener Bytes berechnen. Ich habe ein Script gefunden und etwas erweitert. Es zeigt die Bandbreite für alle Interfaces in Kbits und Mbits an. Das Script ist simpel gehalten und ohne Parameter, die irgend etwas steuern. Aber das kann man ja nachträglich einbauen. Wenn man will.

#!/bin/bash                                                                          

intervalo=2
info="/sys/class/net/"
cd $info
while true; do
for interface in eth*
do
  eval rx1$interface=`cat $info$interface/statistics/rx_bytes`
  eval tx1$interface=`cat $info$interface/statistics/tx_bytes`
done
  sleep $intervalo
for interface in eth*
do
  eval rx2$interface=`cat $info$interface/statistics/rx_bytes`
  eval tx2$interface=`cat $info$interface/statistics/tx_bytes`
done
clear
date
for interface in eth*             
do
  echo $interface
  echo ---- 
  rx1=$(eval echo \${rx1$interface})
  rx2=$(eval echo \${rx2$interface})
  tx1=$(eval echo \${tx1$interface})
  tx2=$(eval echo \${tx2$interface})
  echo RX: $((($rx2-$rx1)/($intervalo*1024))) Kbps
  echo RX: $((($rx2-$rx1)/($intervalo*1048576))) Mbps
  echo TX: $((($tx2-$tx1)/($intervalo*1024))) Kbps
  echo TX: $((($tx2-$tx1)/($intervalo*1048576))) Mbps
done
done
Bandbreite anzeigen

dynamische Variablen mit eval

Ich habe ein Script geschrieben, das sequenziell Variablennamen vergibt. Es ging mir darum, eine Schleife zu bauen und für jeden Durchlauf der Schleife eine neue Variable zu setzen. Später will ich diese Variablen natürlich wieder auslesen. Das klingt einfacher, als es ist. Damit das in einer bash funktioniert, benötigt man den Befehl eval.

Das Dumme ist nur, der Befehl hat gar keine man page, auf der man nachlesen könnte, was er macht und wie er es macht. In einem Satz kann man sagen: eval evaluiert deinen Ausdruck ein weiteres Mal vor der Ausführung.

Angenommen, ich möchte die Variablen X0 bis X3 setzen und wieder auslesen. So geht es nicht:

for N in $(seq 0 3); do
  X$N=hallo$N
  echo $X$N
done

Der output davon ist:

X0=hallo0: command not found
0
X1=hallo1: command not found
1
X2=hallo2: command not found
2
X3=hallo3: command not found
3

Mache ich aber ein eval davor, ein paar Klammern und Slashes dazu, dann klappt es:

for N in $(seq 0 3) ; do
  eval X$N=hallo$N
  eval echo \${X$N}
done

Der Output ist:

hallo0
hallo1
hallo2
hallo3

Das funktioniert übrigens auch mit arrays. Die dafür nötigen eckigen Klammern [] müssen vor die Abschliessende geschweifte bei der Ausgabe.

dynamische Variablen mit eval