![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här. |
Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Senaste Inlägg |
| postfunktionen problem | jwholey | Shell-programmering och Skript | 4 | 05-01-2008 12:21 |
| Script problemet beror på rekursiv kataloger Hjälp snälla | robertmcol | Shell-programmering och Skript | 2 | 04-27-2008 08:00 |
| Funktion Problem och CoreDump | ZINGARO | Shell-programmering och Skript | 8 | 02-19-2008 06:37 |
| rekursiv funktion | bebop1111116 | High Level Programming | 1 | 10-30-2006 08:12 |
| PERL funktion problem | avadhani | Shell-programmering och Skript | 2 | 06-15-2005 05:18 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
Problem med Recursive funktion
Hej alla,
Jag måste flytta alla filer i ett träd katalogstrukturen till en enda katalog. Inorder att veta vilken fil som är från vilken katalog, jag måste lägga till namnet på den katalog till filnamnet. För detta skrev jag en rekursiv funktion som ser ut som följer --------------------------------------------- datamover () ( cd $ 1 # OLD_DIR \u003d $ 2 for i in * göra Om [-d $ i] sedan TMP_DIR \u003d $ i datamover $ TMP_DIR echo $ i annan mv $ i .. / $ 1_ $ i Om [-f $ 1 /] sedan echo några filer fortfarande finns annan cd .. rmdir $ 1 fi fi gjord ) -------------------------------------------------- -------------- När allt jag köra samma på en katalogstruktur som DIRA -> DirB -> DirL -> fileN -> DirM -> fileO ---> DirC -> DirP -> filer -> DirQ -> filer programmet ger utdata som följer DIRA -> DirB -> DirL_fileN -> DirM_fileO ---> DirC -> DirP -> filer -> DirQ -> filer och felsöka ouptut är följande -------------------------------------------------- ---- + Echo Dir namn är DIRA Dir namn är 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 '] " + Mv DirC .. / DirA_DirC mv: kan inte status "DirC: Ingen sådan fil eller katalog + '['-F DIRA / "]" + Cd .. + Rmdir DIRA rmdir: "DIRA: Ingen sådan fil eller katalog -------------------------------------------------- ------------ Kan någon berätta för mig wht är problemet med koden och hur man kan korrigera det? utdatat Jag kräver i detta scenario blir så DIRA -> DirB_DirL_fileN -> DirB_DirM_fileO -> DirC_DirP_fileR -> DirC_DirQ_fileS Tack på förhand |
|
||||
|
Citat:
Den ursprungliga manus misslyckas på grund av for i in * uttalande Den * utvärderas i början av funktionen och inte förutse om filer flyttas till den katalogen från en underkatalog. |
|
||||
|
zazzybob lösning är en elegant och enkel lösning.
Som svar på rekursion inom Korn shell funktion, det finns två saker att beakta. Alla variabler, inklusive den aktuella arbetskatalogen, är globala, om inte särskilt definieras med den funktion som sedan gör att de lokala inom funktionen. Kod:
typeset FILENAME=/etc/hosts
Function ()
{
FILENAME=/etc/resolv.conf
echo $FILENAME
}
echo $FILENAME
Function
echo $FILENAME
/ etc / hosts / etc / resolv.conf / etc / resolv.conf Men, Kod:
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 Ett snabbt och smutsigt sätt att göra variabler lokal till funktionen inklusive arbetsmiljön katalog är att verkställa en funktion i sina egna skal genom att placera parentes inom funktionen parentes. Funktionen kommer att få en egen kopia av miljön när kallade och alla ändringar, inklusive katalog, till att miljön inte kommer att återspeglas i den uppringande script som är sin egen funktion. Kod:
typeset FILENAME=/etc/hosts
Function ()
{ (
FILENAME=/resolv.conf
echo $FILENAME
) }
echo $FILENAME
Function
echo $FILENAME
/ etc / hosts / etc / resolv.conf / etc / hosts Senast redigerad av hegemaro; 02-03-2007 vid 10:41.. |