PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auswahlliste mit Suchausgabe



iBlack
20.01.15, 11:05
Hei Leute,

Ich hab mal versucht, (gescheitert...) nach einer Bestimmten Datei zu suchen und alle Treffer in einer Auswahlliste auszugeben um diese Datei dann per Auswahl zu bearbeiten.

Ich bin soweit gekommen, dass ich eine Auswahlliste und eine Funktionierende Suche habe, nur weiß ich nicht wie ich beides verbinde....

Mein Code:

#!/bin/bash

#Skript Start

clear
echo "Wer bist du?" #Abfrage nach Name des Mitarbeiters
echo "1. Günther"
echo "2. Mönchi"
read mitarbeiter #Eingabe der vorgegeben Auswahl

echo "Um wen gehts? [Kundenname]" #Abfrage nach Name des Kunden
read name
find /../../../../../../../ -type d -name '*'$name'*' -exec basename {} \; | sort
#Suche, ob Kunde schon vorhanden ist
echo "Kunde gefunden? Dann gib den Namen des Gewünschten Kunden ein, wenn der Kunde nicht aufgeführt ist, gib den Speichername für den neuen Kunden an!"
read "name2" #Erneute Eingabe des Kunden, soll ermöglichen, wenn der Kunde schon vorhanden ist, den korrekten Namen einzugeben, um den Richtigen Kunden zu bearbeiten und nicht neu anzulegen

echo "Was willst du machen?" #Abfrage auf Aktion nach Kundenauwahl
echo "1. Kunde bearbeiten"
echo "2. Neuen Kunde erstellen"
read auswahl #Auswahl der Vorgaben, "Bearbeiten" oder "Neu Anlegen" des Kunden


#Beginn der IF Anweisung, unterschiedliche User = unterschiedliche Pfade, der && Befehl frägt ab, welcher Mitarbeiter das Skript benutzt um den Richtigen Pfad zur Bearbeitung anzugeben. Die Abfrage steht nur für bereits vorhandene Kunden, um einen kunden neu zu Erstellen wird eine andere IF Anweisung benutzt. Auswahl der Kunden Aktion steht hier immer aus 1 und nicht auf 2.
if [ "$mitarbeiter" = "1" ] && [ "$auswahl" = "1" ] #Pfad Mitarbeiter 1
then gedit /../../../../../../../ -type d -name '*'$name'*' -exec basename {} \; | sort/"$name2"/"$name2".txt

elif [ "$mitarbeiter" = "2" ] && [ "$auswahl" = "1" ] #Pfad Mitarbeiter 2
then gedit /../../../../../../../"$name2"/"$name2".txt
fi
#Ende der 1. IF Anweisung

#Beginn der zweiten IF Anweisung, hier kommt das Programm hin, falls der Kunde neu angelegt werden soll, Sprich, Auswahl der Aktion für die Kunden steht hier immer auf 2 und nicht auf 1. Auch hier ist die Abfrage des Mitarbeiter entscheident, da auch hier unterschiedliche Pfade verwendet werden.
if [ "$mitarbeiter" = "1" ] && [ "$auswahl" = "2" ] #Pfad Mitarbeiter 1

#Hier wird ein neues Verzeichniss im angegeben Firmen Verzeichniss erstellt, in dem Sich die Übersicht befindet. Der name des Verzeichnisses, bezieht sich au die 2. Eingabe des namens nach der Überprüfung ob der Kunde vorhanden ist oder nicht.
then mkdir //../../../../../../../"$name2"

#Hier wird das Vorlagen Blatt in den neu Angelegten Kundenordner kopiert.
cp /../../../../../../../"Dokumentation.txt" /../../../../../../../"$name2"

#Hier wird die Datei die wir eben in das neu angelegte Verzeichniss kopiert haben in den Selben Namen mit der Endung .txt umbenannt, um sofort zu sehen, um welchen Kunden es sich handelt
mv /../../../../../../../"Dokumentation.txt" /../../../../../../../"$name2"/"$name2".txt

#Nach dem ganzen Erstellungs -Kopier -und Umbenennungsvorgang, wird hier nun die Datei geöffnet (Je nach dem welcher Editor gewünscht ist, kann dieser in der nachfolgenden Zeile beliebig geändert werden) um zu Ende bearbeitet zu werden.
kate /../../../../../../../"$name2"/"$name2".txt


elif [ "$mitarbeiter" = "2" ] && [ "$auswahl" = "2" ] #Pfad Mitarbeiter 2

#Hier wird ein neues Verzeichniss im angegeben Firmen Verzeichniss erstellt, in dem Sich die Übersicht befindet. Der name des Verzeichnisses, bezieht sich au die 2. Eingabe des namens nach der Überprüfung ob der Kunde vorhanden ist oder nicht.
then mkdir /../../../../../../../"$name2"

#Hier wird das Vorlagen Blatt in den neu Angelegten Kundenordner kopiert.
cp /../../../../../../../"Dokumentation.txt" /../../../../../../../"$name2"

#Hier wird die Datei die wir eben in das neu angelegte Verzeichniss kopiert haben in den Selben Namen mit der Endung .txt umbenannt, um sofort zu sehen, um welchen Kunden es sich handelt.
mv /../../../../../../../"Dokumentation.txt" /../../../../../../../"$name2"/"$name2".txt

#Nach dem ganzen Erstellungs -Kopier -und Umbenennungsvorgang, wird hier nun die Datei geöffnet (Je nach dem welcher Editor gewünscht ist, kann dieser in der nachfolgenden Zeile beliebig geändert werden) um zu Ende bearbeitet zu werden.
gedit /../../../../../../../"$name2"/"$name2".txt
fi
#Ende der 2. IF Anweisung

echo "Eingabe für weitere Bearbeitung!" #Hier wird nun AUsgegeben was die nächste Aktion ist, das Skripot kann also beliebig oft ausgeführt werden, durch drücken der Enter Taste am Ende

read #Auslesen der Eingabe, (Wenn leer wird alles als Eingabe gezählt und das Skript wird fortgeführt)

AnruferVorlage #Neustarten des Skriptes
Das ist der Code für die Suche nach dem Kunden bzw. der Datei.
Jetzt wollte ich mit:

auswahl=$(dialog --stdout --backtitle Hauptmenü --title Details --radiolist "Welches Skript möchtest du ausführen?" 20 80 20\ )
case "$auswahl" in
Kunden)
dialog --backtitle Umfrage --title Reaktion --msgbox "Kunde so und so wird bearbeitet" 15 40
.....
esac

Diesem Code eine Auswahl Oberfläche erstellen um per Pfeiltasten den Kunden auszuwählen.
Ist es möglich diese 2 Komponenten zu vereinen?

drcux
20.01.15, 12:13
kunden=$(find /../../../../../../../ -type d -name '*'$name'*' -exec basename {} \; | sort)
auswahl=$(dialog --stdout --menu testauswahl 40 40 40 $(for i in $kunden; do echo $i "-"; done))

Wobei ich dein dauerndes "/../../usw" nicht verstehe, mit dem vorangestellten "/" landest du eh immer im Stammverzeichnis...

iBlack
20.01.15, 12:23
Ups :O

Da is mir wohl beim Copy Paste was falsch unter gerutscht.

Danke für den Hinweis und war nicht beabsichtigt! =)

iBlack
20.01.15, 12:58
Hm, ja okay das mit der Liste funktioniert so einigermaßen Danke dafür schon mal!!

Die Namen der Kunden sind aber mit Kommas getrennt also Nachname, Vorname

Also werden die Namen jetzt geteilt untereinander angezeigt.

Also Peterson Michael z.B.

Peterson -
,Michael -
.....

Wie kann ich außerdem den Ausgewählten Kunde weiterbearbeiten?

Also der Kunde ist hinterlegt als .txt Datei, wenn ich jetzt in der Auswahl auf den Kunden gehe und bestätige dann soll sich dieser Kunde öffnen und ich soll die .txt Datei weiterbearbeiten können.

marce
20.01.15, 13:35
das mit dem Umbruch solltest Du durch passendes Quoting hinbekommen. Danach sollte sich auch der Rückgabewert von Dialog entsprechend einfacher bearbeiten lassen können.

iBlack
20.01.15, 13:59
Ich versteh nich ganz, hab so ziemlich jeder erdenkliche und für mich logische Lösung ausprobiert e.e
Sprich, die Qutes an jeder erdenklichen für mich logischen Stelle versucht zu setzen...
Ohne Erfolg...

Muss ich wohl noch ne weile suchen bis ich mein Fehler finde..

drcux
20.01.15, 14:16
Vorher:

IFS="
"

iBlack
20.01.15, 15:07
? IFS an welcher Stelle?
Statt der auswahl oder danach?

drcux
20.01.15, 18:41
http://mamu.backmeister.name/programmierung-und-skripting/shellskript-quicktipp-ifs-auf-newline-setzen/

drcux
20.01.15, 20:51
Und wenn du das dann hast, lass uns mal den ersten Teil "schön machen", das was du da hast, ist ja fürchterlich.... ;)

iBlack
21.01.15, 16:35
Hmmm, wenn ich das IFS=$'\n' einsetze wird ja unterbrochen, dass nach einer Leerstelle die Ausgabe in einem neuen Absatz ausgegeben wird, sprich der Umbruch wird unterbindetr bzw unterbrochen richtig?

Wenn ich das aber in mein Skript einfüge, (was ich denke was ich mal wieder verbockt habe :P) dann bekomme ich diesen Fehler
Error: Expected 2 arguments, found only 1.


Sorry,

marce
21.01.15, 17:40
es geht nichts über debug-Ausgaben.

Naja, ok, sauberer, strukturierter Code vielleicht, aber man kann ja nicht alles haben...

drcux
21.01.15, 18:38
Du versuchst ja auch anscheinend immer ******e in ******e zu integrieren, sorry... ;)

Fangen wir also von vorne an, warum fragst du den Nutzer ab? Sind beide Nutzer echte Linuxnutzer oder einfach nur zwei Menschen, die den gleichen Account auf einem Rechner nutzen?

iBlack
22.01.15, 06:58
Es sind 2 verschiedene Rechner, das Skript liegt auf nem Tauschlaufwerk und der Pfad des anderen Nutzers
ist natürlich anders weils n anderer Benutzer ist
und er den Pfad auf sich angegeben hat.

drcux
22.01.15, 12:14
Na, dann kannst du doch einfach die Variable USER abfragen, wer das Skript startet. Außerdem solltest du die Eigenheiten (Pfade/Editor) der beiden User in eine Variable (Array) packen, das wird dann übersichtlicher. Am besten auch noch absolute Pfade nehmen, also zb. "/home/benutzer/hier/hab/ich/meine/kunden"



#!/bin/bash

# Daten Nutzer 1 Harry
pfad[1]="/wo/auch/immer/kunden"
editor[1]="gedit"
# Daten Nutzer 2 Willi
pfad[2]="/ich/habs/woanders/kunden"
editor[2]="kate"

if [ $USER -eq "Harry" ]
then u=1
elif [ $USER -eq "Willi" ]
then u=2
else echo "Nuter unbekann!"; exit 1
fi

echo "Du bist Nutzer " $u ", dein Editor ist " ${editor[$u]} " und dein Pfad lautet " ${pfad[$u]}
exit 0


Wenn dieser Teil funktioniert, sehen wir weiter... ;)

iBlack
22.01.15, 12:21
Das schön machen geht doch auch im Nachhinein e.e bisher funktioniert alles wie es soll,
außer das ich jetzt die "Grafische Oberfläche" mit einbauen möchte...

Trotzdem danke!

iBlack
22.01.15, 12:29
echo "Du bist Nutzer " $u ", dein Editor ist " ${editor[$u]} " und dein Pfad lautet " ${pfad[$u]}
Wenn dieser Teil funktioniert, sehen wir weiter... ;)

Ich will außerdem keine Ausgabe haben welcher Nutzer welchen Pfad und welchen Editor hat deswegen frag ich mich grade warum du da geschrieben hast =P

marce
22.01.15, 12:58
Stichwort "debug-Ausgaben".

Bestehenden Code schön machen läuft übrigens vom Aufwand her auf "neu programmieren" hinaus - was im Normalfall immer mehr Aufwand ist als sich gleich Gedanken machen und sauber und strukturiert vorgehen. Aber das erzähle ich Dir ja auch schon seit Deinem 1. Thread...

iBlack
22.01.15, 13:52
Das interessiert mich gerade eher wenig, weil das nichts zum Thema beiträgt aber das erzähle ich dir auch schon seit deinem ersten Hinweis.

drcux
22.01.15, 15:31
Das schön machen geht doch auch im Nachhinein e.e bisher funktioniert alles wie es soll,

Ja, aber wenn du so etwas postest, hat keiner Lust sich das anzuschauen. Saubere Skripte sind leichter zu lesen und man kann dir besser helfen.
Übrigens: Man sollte nie mit "echo" geizen solange das Skript noch nicht fertig ist, auskommentieren/löschen kann man sie später immer noch.



außer das ich jetzt die "Grafische Oberfläche" mit einbauen möchte...


Dann mach es doch, du musst nur in der von mir geposteten Schleife (for i in $kunden ...) richtig quoten wenn eine Variable Leerzeichen enthält...

drcux
24.03.15, 20:00
Nur so als Tipp, auch wenn du lernresistent bist. Ich wurde gefragt, ob ich ne kleine UI für nen SambaAD schreiben kann. Nur User anlegen, löschen und PW resetten. Dabei fiel mir dieser Thread wieder ein. Hier meine ersten Zeilen um zu verdeutlichen, wie eine Liste in dialog eingefügt wird:



#! /bin/sh

IFS=$'\n'

function mainmenu
{
choice=$(dialog --stdout --menu "Hauptmenu" 10 20 5 \
1 "Edit User" \
0 "EXIT" \
)

case $choice in
0)
exit 0
;;
1)
edituser
;;
esac
}

function edituser
{
userlist=$(pdbedit -L | egrep -v 'Gastkonto|\$|nobody|krbtgt|dns-server|Administrator' | sort)
choice=$(dialog --stdout --menu "User bearbeiten" 40 60 40 \
$(for i in $userlist; \
do \
loginname=$(echo $i | cut -f 1 -d':' | cut -f 2 -d'\'); \
fullname=$(echo $i | cut -f 3 -d':'); \
echo -e $loginname"\n" $fullname; \
done \
)
)
echo $choice
}

mainmenu

unset IFS

exit 0;


Bestimmt nicht perfekt, aber jeder der das liest sollte es verstehen können...

PS: fullname enthält Leerzeichen!