staging.inyokaproject.org

dialog - Ordnerinhalt als radiolist

Status: Ungelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

desser

(Themenstarter)

Anmeldungsdatum:
10. Januar 2018

Beiträge: 27

@Marc_BlackJack_Rintsch & @frostschutz: Ich schätze eure Hilfe. Ich möchte lediglich wissen, wie es möglich ist einen Ordnerinhalt auzulesen und jedes einzelne Element in einer Radioliste anzuzeigen. Der Name des ausgewählten Elements soll dann in einer Variablen als STRING gespeichert werden. Diese Variable möchte ich im Script weiterverwenden.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@desser: Das sollte der Vorschlag von frostschutz ja machen. Ich hätte das vom Prinzip her genau so gelöst. Ich bin ein bisschen von richtigen Programmiersprachen geschädigt und schreibe deswegen gerne ”saubere” Programme, mit lokalen Variablen und versuche ein bisschen auf Lesbarkeit und Verständlichkeit zu achten. Darum sind meine Shell-Lösungen manchmal etwas länger. ☺ Meine Variante würde so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

ChooseEntryFrom() {
    local basePath=$1
    local filename
    local -a items
    
    items=()
    for filename in "$basePath/"*; do
        items+=("$filename" '' 'OFF')
    done
    dialog --stdout --radiolist "Select an entry:" 15 60 10 -- "${items[@]}"
}

Main() {
    local result
    result=$(ChooseEntryFrom ./tmp)
    echo "Exit $?, Result '$result'."
}

[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"

Ich würde allerdings überlegen ob ein --menu nicht besser ist als eine --radiolist, denn bei der --radiolist passiert es relativ leicht, dass man zu einem Eintrag geht und die Eingabetaste drückt ohne den Eintrag vorher mit der Leertaste auch tatsächlich ausgewählt zu haben.

Zudem würde ich den Dateinamen, der ja innerhalb des einen Verzeichnisses eindeutig ist, als Tagnamen verwenden. Dann kann der Benutzer nicht nur mit den Cursortasten rauf und runter navigieren, sondern auch mit dem Anfangsbuchstaben des Dateinamens zum ersten Namen mit diesem Buchstaben springen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ChooseEntryFrom() {
    local basePath=$1
    local filename
    local -a options
    
    options=()
    for filename in "$basePath/"*; do
        options+=("$(basename "$filename")" "$filename")
    done
    
    if filename=$(dialog --stdout --menu "Select an entry:" 15 60 10 -- "${options[@]}")
    then
        echo "$basePath/$filename"
    else
        exit 1
    fi
}

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

Marc_BlackJack_Rintsch schrieb:

Ich bin ein bisschen von richtigen Programmiersprachen geschädigt und schreibe deswegen gerne ”saubere” Programme, mit lokalen Variablen

Das hört sich unterschwellig ein wenig so an, als würde ich unsaubere Programme schreiben. 😀 (Stimmt natürlich - wer nicht?)

Daher nur zur Erklärung warum das bei mir so komisch aussieht - ich mache viel in Busybox und da gibts ohne weiteres nun mal keine Arrays & Co.

$ busybox sh
~ $ items=()
sh: syntax error: unexpected "("

...und dann kommt man eben dazu, stattdessen mit der Argumentliste zu jonglieren als Array-Ersatz.

Lokale Variablen sind ein guter Punkt, spielen aber in diesem Fall keine Rolle, da es in der Subshell läuft.

Bei komplexen Datenstrukturen muss man sich irgendwann überlegen, ob Python (oder awk, oder...) nicht doch besser wäre.

Ansonsten höre ich bei solchen Codeschnipseln gerne dann auf, wenn es die Idee rüberbringt. Der Feinschliff ist dann in eigener Arbeit zu leisten.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@frostschutz: Nee, so war das nicht gemeint! Ich hatte das nur geschrieben um mich prophylaktisch zu ”verteidigen”, weil mir schon mal gesagt wurde das meine Shell-Programme so komisch aussehen, als wären das ”echte” Programme. ☺

Antworten |