![]() |
Hallo und herzlich Willkommen aus den Vereinigten Staaten, die UNIX-und Linux-Foren! Vielen Dank für Ihren Besuch und die Teilnahme an unserem Global Community.
|
|
Google unix.com
|
|||||||
| Foren | Registrieren | Forum-Regeln | Links | Alben | FAQ | Benutzerliste | Kalender | Suche | Die heutige Beiträge | Alle Foren als gelesen markieren |
| Shell Programmierung und Scripting Post Fragen zu ksh, csh, sh, bash, Perl, PHP, sed, awk und anderen Shell-Skripte und Shell-Scripting-Sprachen hier. |
Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
|
||||
| Faden | Thread Starter | Forum | Antworten | Last Post |
| Mail-Funktion Problem | jwholey | Shell Programmierung und Scripting | 4 | 05-01-2008 12:21 PM |
| Script-Problem durch rekursive Verzeichnisse Hilfe wenden Sie sich bitte | robertmcol | Shell Programmierung und Scripting | 2 | 04-27-2008 08:00 PM |
| Funktion Problem-und coredump | Zingaro | Shell Programmierung und Scripting | 8 | 02-19-2008 06:37 PM |
| rekursive Funktion | bebop1111116 | High-Level-Programmierung | 1 | 10-30-2006 08:12 PM |
| PERL Funktion Problem | avadhani | Shell Programmierung und Scripting | 2 | 06-15-2005 05:18 AM |
![]() |
|
|
LinkBack | Thread Tools | Suche diesen Thread | Rate Thread | Anzeige-Modi |
|
|
|
||||
|
Problem mit Rekursive Funktion
Hi all,
Ich habe, um alle Dateien in einem Verzeichnis-Baum, an einem einzigen Verzeichnis. Inorder zu wissen, welche Datei aus dem Verzeichnis, werde ich haben, um den Namen des Verzeichnisses dem Namen der Datei. Für diese habe ich eine rekursive Funktion, die sich wie folgt --------------------------------------------- datamover () ( cd $ 1 # OLD_DIR \u003d $ 2 for i in * tun if [-d $ i] dann TMP_DIR \u003d $ i datamover $ TMP_DIR echo $ i sonst mv $ i .. / $ 1_ $ i if [-f $ 1 /] dann echo Dateien noch vorhanden sonst cd .. rmdir $ 1 fi fi getan ) -------------------------------------------------- -------------- Wann immer ich die gleiche Ausführung auf eine Verzeichnis-Struktur als DIRA -> DirB -> DirL -> filen -> DirM -> fileO ---> DIRC -> DIRP -> Filer -> DirQ -> Dateien das Programm gibt die Ausgabe wie folgt DIRA -> DirB -> DirL_fileN -> DirM_fileO ---> DIRC -> DIRP -> Filer -> DirQ -> Dateien und die Debug-ouptut ist wie folgt -------------------------------------------------- ---- Echo + R Name ist DIRA R Name ist DIRA + MAIN_DIR \u003d DIRA + Datamover DIRA + CD DIRA + '['-D DirB ']' + TMP_DIR \u003d DirB + Datamover DirB + CD DirB + '['-D DirL ']' + TMP_DIR \u003d DirL + Datamover DirL + CD DirL + '['-D filen ']' + Mv filen .. / DirL_fileN + '['-F DirL / ']' + Cd .. + Rmdir DirL + Echo filen filen + '['-D DirM ']' + TMP_DIR \u003d DirM + Datamover DirM + CD DirM + '['-D fileO ']' + Mv fileO .. / DirM_fileO + '['-F DirM / ']' + Cd .. + Rmdir DirM + Echo fileO fileO + Echo fileO fileO + '['-D DIRC ']' + DIRC mv .. / DirA_DirC mv: cannot stat `DIRC": Keine solche Datei oder ein Verzeichnis + '['-F DIRA / ']' + Cd .. + Rmdir DIRA rmdir: `DIRA": Keine solche Datei oder ein Verzeichnis -------------------------------------------------- ------------ Kann jemand mir sagen, weiss ist das Problem mit dem Code, und wie, um es zu korrigieren? Ich benötige die Ausgabe in diesem Szenario wird als DIRA -> DirB_DirL_fileN -> DirB_DirM_fileO -> DirC_DirP_fileR -> DirC_DirQ_fileS Vielen Dank im Voraus |
|
||||
|
Zitat:
Das Original-Skript nicht, weil der for i in * Aussage Die mit * wird am Anfang der Funktion und geht nicht davon aus auf Dateien in diesem Verzeichnis aus einem Unterverzeichnis. |
|
||||
|
zazzybob-Lösung ist eine elegante und einfache Lösung.
Als Reaktion auf Rekursion in einer Korn-Shell-Funktion gibt es zwei Punkte zu beachten. Alle Variablen, einschließlich der aktuellen Arbeitsverzeichnis, sind global, es sei denn, die mit der Funktion, die sie dann vor Ort in der Funktion. Code:
typeset FILENAME=/etc/hosts
Function ()
{
FILENAME=/etc/resolv.conf
echo $FILENAME
}
echo $FILENAME
Function
echo $FILENAME
/ etc / hosts / etc / resolv.conf / etc / resolv.conf Jedoch, Code:
typeset FILENAME=/etc/hosts
Function ()
{
typeset FILENAME
FILENAME=/etc/resolv.conf
echo $FILENAME
}
echo $FILENAME
Function
echo $FILENAME
/ etc / hosts / etc / resolv.conf / etc / hosts Eine schnelle und schmutzige Art und Weise, um lokale Variablen der Funktion einschließlich der Arbeitsweise der Dienststellen ist für die Ausführung der Funktion in ihrer eigenen Schale durch Klammern in der Funktion Klammern. Die Funktion wird eine eigene Kopie der Umwelt, wenn sie und alle Änderungen, einschließlich des Verzeichnisses, in dieser Umgebung werden nicht in das aufrufende Skript, das seine eigene Funktion. Code:
typeset FILENAME=/etc/hosts
Function ()
{ (
FILENAME=/resolv.conf
echo $FILENAME
) }
echo $FILENAME
Function
echo $FILENAME
/ etc / hosts / etc / resolv.conf / etc / hosts Zuletzt bearbeitet von hegemaro; am 02-03-2007 10:41 AM.. |
![]() |
| Lesezeichen |
| Thread Tools | Suche diesen Thread |
| Anzeige-Modi | Rate this thread |
|
|