[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] [Bash] test om filer eksisterer i en for loop



Hej

On Thu, 10 Jul 2008 23:15:14 +0200, Anders Thøgersen wrote:
> Hej,
> 
> On 20:47 Thu 10 Jul 2008, Sune Vuorela wrote:
>> On 2008-07-10, Anders Thøgersen <sslug@sslug> wrote:
>> > Hej,
>> >
>> > Hvorfor fungerer dette ikke:
>> >
>> > 	foo() { \ls -1 $HOME; }

Det er en dårlig ide generelt at bruge /bin/ls  i scripts, da outputet 
ikke er formateret til at bruges i scripts. Desuden er det nemmere og mere
effektivt at bruge 'globing':

	for i in $HOME/* ; do ...

Man skal så lige være opmærksom på om shell option 'noglob' er off, det 
er den dog per default. Det slås fra med 'set +o noglob' i bash (default)

>> > 	
>> > 	for i in $(foo); do
>> > 	  [[ -e $i ]] && echo $i
>> > 	done
>> >
>> > Jeg forstår det ikke...  Hvis jeg skriver:
>> >
>> > 	for i in $(foo); do
>> > 	  echo $i
>> > 	done
>> >
>> > Så sker der det jeg forventer,.. hmmm, er der nogen der kan hjælpe
>> > mig?

Det virker på min bash 3.2.39(1)-release (ses med 'echo $BASH_VERSION').
Ved at bruge ", altså skrive [[ -e "$i" ]] ... så håndteres mellemrum og 
linjeskift i filnavne korrekt, det kan være årsagen, selvom i den bash 
version jeg har fandt den alligevel filer med mellemrum i navnet. 

>> 
>> Hvor står du henne når du skriver det?
> 
> I mit hjemme dir.
> 
>> Og hvad er det for noget med [[ ]]?
>> Og den der \ foran ls ?
> 
> [[ ]] er ganske almindelig kort syntax. [[ ... ]] || echo "hallo", fx.

Det er den "nye" conditional i bash, den kom vist i version 3, som har en 
lidt anden syntax og flere funktioner, fx [[ "$i" =~ txt ]] matcher på 
regulære udtryk som i regex(3)

> 
> \ foran ls betyder at jeg vil eksekvere ls udenom det alias jeg har
> defineret for ls, dvs /bin/ls.
> 
>> Jeg gjorde lige:
>> 
>> foo() { ls -1 $HOME }
>> for i in $(foo)
>> do
>> 	[ -e $i ] && echo $i
>> done
>> 
>> og jeg fik listen af emner der var fælles for pwd og $HOME
>> 
>> Og tilmed virker det hvis /bin/sh ikke nødvendigvis er bash.
> 
> Det er godt at høre at det virker for dig!  Jeg var overbevist om at det
> jeg skrev ikke er helt vanvittigt.  Måske har jeg en mærkelig shell
> setting?  Jeg kan fx. ikke definere foo() ovenover som du gør uden at
> sætte semikolon efter $HOME.  Hvis jeg gør det så vises "continuation"
> prompten.

Det er heller ikke lovlig syntax i bash eller sh, men jeg så det virkede 
i zsh :)

> 
> Enkel kantet parantes som du bruger virker på samme måde hos mig, men
> jeg synes at kunne huske noget om at det er bedre at bruge [[ ]].

Personligt kan jeg bedre lide syntaxen i [[, da den er mere C-agtig. 
Men som Sune skriver så er det ikke shell uafhængigt. Men er understøttet i 
ksh, zsh og bash. Men ikke i sh og dash. Så man skal ikke bruge det i system 
scripts.

/Lars


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2008-08-01, 02:01 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *