bash-skipt Hilfe benötigt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
stschulze
Beiträge: 8
Registriert: 12.10.2013 19:08:02

bash-skipt Hilfe benötigt

Beitrag von stschulze » 13.02.2022 10:45:06

Hallo,

ich versuche eine Code-Schnipsel für ein bash-Skript zu bauen, welches die im System verfügbaren Netzwerk-Devices ausfindig macht und anschließend über einen Dialog-Befehl zur Auswahl anbietet. Anschließend wird nach dem Dialog-Befehl eine Funktion aufgerufen, welche den Wert der Dialog-Auswahl übergeben bekommt.

Da dieNetzwerkkarten von System zu System variieren können, sollte es möglichst dynamisch arbeiten. Wo liegt mein Fehler?

Code: Alles auswählen

#!/bin/sh

    netdevsum="$(ls /sys/class/net -l | awk '{print $9}'| wc -l)"
    echo "Anzahl der ermittelten Netzwerk-Devices: $netdevsum"	
    i="1"
    while [ $i -lt $netdevsum ]; 
    do 
		#echo "Ermittlung steht an für: $netdev$i"
		#sleep 2
		netdev$i="$(ls /sys/class/net -l | awk '{print $9}'| head -n2| tail -n1)"
                i=$[$i++] 
    done

#Auch das dynamische Erzeugen der Einträge in der Dialog-Box wäre super ;-)
    netdev=`dialog --radiolist "Netzwerkkarte mit LEERTASTE auswaehlen" 0 0 7 \
     $netdev1 "" off\
     $netdev2 "" off\
     $netdev3 "" off\
     $netdev4 "" off\
     $netdev5 "" off 3>&1 1>&2 2>&3`
    dialog --clear
    clear
    echo "Ihre Auswahl: $netdev"
Zuletzt geändert von Meillo am 13.02.2022 10:47:35, insgesamt 1-mal geändert.
Grund: code-Tags ergaenzt

Benutzeravatar
whisper
Beiträge: 3373
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: bash-skipt Hilfe benötigt

Beitrag von whisper » 13.02.2022 11:12:21

Ich beziehe mich nur auf die unnötige Leerzeile
Man kann z.B.

Code: Alles auswählen

ls -l /sys/class/net  | awk '{print $9}'| grep -v "^$"|wc -l
verwenden
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

DeletedUserReAsG

Re: bash-skipt Hilfe benötigt

Beitrag von DeletedUserReAsG » 13.02.2022 11:12:41

stschulze hat geschrieben: ↑ zum Beitrag ↑
13.02.2022 10:45:06
Wo liegt mein Fehler?
Du schreibst nicht, was nicht funktioniert.

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: bash-skipt Hilfe benötigt

Beitrag von JTH » 13.02.2022 11:20:08

Dein Vorgehen, um die Netzwerkdevices aufzulisten, ist unnötig kompliziert.

Code: Alles auswählen

ls -l /sys/class/net
gibt viel mehr aus, als du willst. Passender wäre

Code: Alles auswählen

ls -1 /sys/class/net/
(eine Eins, statt einem kleinen L). Aber auch das geht noch einfacher. Pfade mit Wildcard vervollständigen kann die Shell auch selbst und das sollte man in den aller-allermeisten Fällen ausnutzen. Es erlaubt nämlich – oder erleichtert zumindest wesentlich – den Umgang mit Dateipfaden mit z.B. Leerzeichen.

Du könntest dir dann z.B. so das notwendige Argument für dialog konstruieren:

Code: Alles auswählen

netdevs=
for netdev_path in /sys/class/net/*; do
        netdev=${netdev_path##*/}    # Das entfernt alles bis zu und inkl. des letzten / im Pfad
        netdevs="$netdevs $netdev '' off"
done

Der Aufruf wird dann kürzer:

Code: Alles auswählen

netdev=$(dialog --radiolist "Netzwerkkarte mit LEERTASTE auswaehlen" 0 0 7 $netdevs 3>&1 1>&2 2>&3)

Code: Alles auswählen

netdev$i=
Das dürfte neben
niemand hat geschrieben: ↑ zum Beitrag ↑
13.02.2022 11:12:41
Du schreibst nicht, was nicht funktioniert.
dein Fehler sein. So eine Variablenzuweisung ist syntaktisch falsch. Eine Zuweisung mit „dynamischem“ Namen müsste man anders lösen.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash-skipt Hilfe benötigt

Beitrag von Meillo » 13.02.2022 11:22:18

whisper hat geschrieben: ↑ zum Beitrag ↑
13.02.2022 11:12:21
Ich beziehe mich nur auf die unnötige Leerzeile
Man kann z.B.

Code: Alles auswählen

ls -l /sys/class/net  | awk '{print $9}'| grep -v "^$"|wc -l
verwenden
Nur kurz nebenbei: `grep -v "^$"' (was ``keine Zeile die leer ist'' bedeutet) ist identisch zu `grep .' (was ``jede Zeile, die zumindest ein Zeichen enthaelt'' bedeutet). Zweiteres ist einfacher und kuerzer. ;-)
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: bash-skipt Hilfe benötigt

Beitrag von MSfree » 13.02.2022 11:36:03

Meillo hat geschrieben: ↑ zum Beitrag ↑
13.02.2022 11:22:18
whisper hat geschrieben: ↑ zum Beitrag ↑
13.02.2022 11:12:21
Ich beziehe mich nur auf die unnötige Leerzeile
Man kann z.B.

Code: Alles auswählen

ls -l /sys/class/net  | awk '{print $9}'| grep -v "^$"|wc -l
verwenden
Nur kurz nebenbei: `grep -v "^$"' (was ``keine Zeile die leer ist'' bedeutet) ist identisch zu `grep .' (was ``jede Zeile, die zumindest ein Zeichen enthaelt'' bedeutet). Zweiteres ist einfacher und kuerzer. ;-)
Naja, und dieses ganze umständliche awk|grep|wc Kontrukt liefert doch auch nichts anderes als

Code: Alles auswählen

ls /sys/class/net | wc -l

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: bash-skipt Hilfe benötigt

Beitrag von smutbert » 13.02.2022 12:22:51

Bei ähnlichen Dingen verwende ich unheimlich gerne Debianfzf. Das erlaubt die Auswahl aus einer Liste mit den Pfeiltasten, der Eingabe von Textbruchstücken und in den meisten Terminals auch mit der Maus. Aussehen könnte ein Skript etwa so

Code: Alles auswählen

Interface="$(ls /sys/class/net/ | fzf)"

# abbrechen falls kein Interface ausgewaehlt wurde
test -z "${Interface}" && exit 0

# irgendetwas mit dem Interface machen
echo "Ausgewaehltes Netzwerkinterface: ${Interface}"

Antworten