Avatar billede shjdsi Nybegynder
19. april 2002 - 14:29 Der er 16 kommentarer og
1 løsning

shell script

Lidt string og var prolbemer

Først finder jeg længden af min tekststreng som er en linie i en fil.

LEN=`cat fil1.lst | head -$i |tail -1|awk ' { print  length($0) } '`

Derefter vil jeg substr på denne måde
cat fil1.lst | head -$i |tail -1 | awk ' {print substr($0,2,$LEN) } '

Men det er ligesom at det ikke er muligt at læse en variabel fra sin shell i en awk sætning, hvis jeg f.eks bare udskifter $LEN med 20 virker det fint nok

hvordan kan jeg løse det ?
Avatar billede erikjacobsen Ekspert
19. april 2002 - 14:35 #1
(det er vel irrelevant, men det er nemt i Perl - undskyld forstyrrelsen...)
Avatar billede shjdsi Nybegynder
19. april 2002 - 14:39 #2
Det har du helt ret i Erik, jeg ville egenligt også hellere lave det i perl, men dette script skal laves i shell da der er så mange andre ting i opgaven der er nemmere at skrive i shell, untaget lige strings håndtering, som jeg så bliver nød til at bruge awk til.
Avatar billede erikjacobsen Ekspert
19. april 2002 - 14:54 #3
Ok, så da. Shell-programmering er også sjovt.
Bruger du sh?
Jeg får måske tid senere på dagen
Avatar billede shjdsi Nybegynder
19. april 2002 - 14:57 #4
Jeg bruger ksh i solaris 8. Ogf ja shell/awk kan også være sjovt :-)
Avatar billede erikjacobsen Ekspert
19. april 2002 - 15:11 #5
Ok, jeg gætter på du skal skrive

cat fil1.lst | head -$i |tail -1 | awk " {print substr(\$0,2,$LEN) } "

Det er vist nemmest du bare prøver. Burde virke i sh - og måske i ksh
Avatar billede skau Nybegynder
19. april 2002 - 15:15 #6
Det er fordi at din vairabel skal defineres i awk (awk er jo et programmeringssprog for sig selv - derfor skal variabler overføres hertil)
Avatar billede shjdsi Nybegynder
19. april 2002 - 15:24 #7
skau > det ved jeg godt det er, men burde det ikke være muligt at bruge sine shell vars inde i awk, de 2 ting har dog alligevel hørt sammen siden 1978. Jeg mener der er en måde at gøre det på, kan bare ikke lige komme på det.
Avatar billede erikjacobsen Ekspert
19. april 2002 - 15:27 #8
Virker mit ikke?
Avatar billede shjdsi Nybegynder
19. april 2002 - 15:32 #9
Erik, det gør det faktisk :-) men hvad mon den lille \ egenligt betyder siden den pludselig vil læse varen fra shell.
Avatar billede erikjacobsen Ekspert
19. april 2002 - 15:35 #10
Nåh, jamen det er stort set li'som i Perl

i '......' stroffer sker der ikke $-substitution af variabler, hvilket i
din første linie er godt nok, da der jo skal stå $0 i awk-scriptet.

I "....." sker der $-substitition - men du får et vaskeægte $-tegn
ved at sætte \ foran. $LEN derimod bliver erstattet med 20, hvis
LEN har den værdi.
Avatar billede shjdsi Nybegynder
19. april 2002 - 15:38 #11
sjovt, har lige opdaget noget:
når jeg gør det her
SOURCE=`cat fil1.lst | head -$i |tail -1 | awk ' {print substr(\$0,3,$LEN) } '`
Bliver SOURCE ikke sat
men gør jeg sådan her
SOURCE=`cat fil1.lst | head -$i |tail -1 | awk ' {print substr($0,3,50) } '`
Bliver den sat.

Ja jeg undrer mig bare ?
Avatar billede erikjacobsen Ekspert
19. april 2002 - 17:17 #12
Du skal bruge dobbelt stroffer "...."
Avatar billede shjdsi Nybegynder
06. maj 2002 - 16:48 #13
Faktisk så fejler mit script med "....." og det fejler ikke med '.....' Det kan være en forskel i linux og solaris.
Avatar billede erikjacobsen Ekspert
06. maj 2002 - 17:38 #14
Muligvis - jeg tror jeg har testet mad bash. Hvad præcis er det der
virker / ikke virker ?
Avatar billede shjdsi Nybegynder
07. maj 2002 - 09:12 #15
følgende fejl kommer når jeg anvender linien.
LEN=`cat $HOMEDIR/fil1.lst | head -$i |tail -1|awk ' { print  length($0) } '`
                SOURCE=`cat $HOMEDIR/fil1.lst | head -$i |tail -1 | awk " {print substr(\$0,2,$LEN) } "`


awk: syntax error near line 1
awk: illegal statement near line


Hele scriptet ser sådan her ud. Det er korn shell
#!/bin/ksh
HOMEDIR=/opt/mosaic/shj
TARGET_CNT=3
x=0
while [ $x -le $TARGET_CNT ] ; do
        if [ $x == 0 ] ; then
                echo her vflges filsystem1
                TARGET=/share/mosaic/shjtest
                TARGETSOURCE=/share/mosaic/autoci/checkinfile
        elif [ $x == 1 ] ; then
                echo her vlges filsystem2
                TARGET=/share/mosaic/shjtest1
                TARGETSOURCE=/share/mosaic/shjtest
        elif [ $x == 2 ] ; then
                echo her vlges filsystem 3
                TARGET=/share/mosaic/shjtest2
                TARGETSOURCE=/share/mosaic/shjtest1
        elif [ $x == 3 ] ; then
                TARGET=/share/mosaic/autoci/checkinfile
                TARGETSOURCE=/share/mosaic/shjtest2
        else
                echo nu er der ikke flere
        fi
        x=`expr $x + 1`
        cd $TARGETSOURCE
        find . -name .rsrc -prune -o -type d -print > $HOMEDIR/fil1.lst
        LINES=`wc -l $HOMEDIR/fil1.lst`
        i=0
        while [ $i -lt $LINES ] ; do
                i=`expr $i + 1`
                LEN=`cat $HOMEDIR/fil1.lst | head -$i |tail -1|awk ' { print  length($0) } '`
                SOURCE=`cat $HOMEDIR/fil1.lst | head -$i |tail -1 | awk " {print substr(\$0,2,$LEN) } "`
                #cat fil1.lst | head -$i |tail -1 | awk ' {print substr($0,3,50) } '
                echo dette er sorce: $SOURCE
                echo Dette er target og source: $TARGET$SOURCE
                ls  "$TARGET$SOURCE" >> /dev/null

                if [ $? != 0 ]; then
                        #cd $TARGET
                        mkdir "$TARGET$SOURCE"
                        echo har lavet dir
                        cd /opt/mosaic/shj
                fi
        done
done


Jeg har iøvrigt lavet et andet script til mirror af directory struktur, der anvender find newer than, det er meget mindre krævende rent performance mæssigt. Men dette script vil jeg bruge til at synkronisere filsystems strukture.
Avatar billede erikjacobsen Ekspert
07. maj 2002 - 10:25 #16
Hmm - jeg har ikke umiddelbart adgang til ksh.

Men det kan da godt være der er forskel til bash og sh.

Dumt spørgsmål: hvorfor skal det være ksh ? :)
Avatar billede shjdsi Nybegynder
07. maj 2002 - 10:28 #17
Det er heller ikke bydende nødvendigt, det er bare det jeg kender best syntaxen i. Kan da være jeg skal prøve bash. Det er vist default shell for de fleste linux bokse, det er  i hvert fald for min.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester