geir__hk Skrevet 13. april Del Skrevet 13. april Sitter og plunder litt for meg selv, og har i sammenheng med backuprutine tenkt å gjøre det litt enkere for meg selv, simpelthen ved å teste om brukernavn og datamaskinnavn er riktig før backup kjøres. I den forbindelse kom jeg over et lite problem: Har to funksjoner, disse returnerer 1 hvis riktig bruker/datamaskinnavn og 0 hvis feil bruker/datamaskinnavn. I andre scriptspråk (f.ex. Autohotkey) fungerer det helt fint å kalle opp begge funksjoner på en linje og sette AND operatir imellom slik at testen er sann kun når begge funksjonene returnerer 1. Men - i bash får jeg denne feilmeldingen når jeg prøver å kjøre bash-fila: line 47: [: staticControlUsername: integer expression expected Hver for seg er det ingen problem å kalle opp funksjonene for å teste om de returnerer sann eller ikke: Funksjonsoppkallet som ikke fungerer: if [ staticControlUsername -eq 1 -a staticControlMachineName -eq 1 ]; then Har også prøvd: if [ staticControlUsername -a staticControlMachineName -eq 1 ]; then if [ [ staticControlUsername ] -a [ staticControlMachineName ] ]; then if [ staticControlUsername ] && [ staticControlMachineName ] ; then sistnevnte viste seg å alltid returnere sann (farlig?), og ser heller ikke ut til å faktisk kjøre innholdet i funksjonene. Noen som har fasit på om dette lar seg gjøre (for å unngå å måtte definere midlertidige variabler eller nøstede if) ? Lenke til kommentar
tingo Skrevet 13. april Del Skrevet 13. april Ja, det lar seg gjøre. Du bør lese man-siden for test ('['): https://ss64.com/bash/test.html Lenke til kommentar
geir__hk Skrevet 13. april Forfatter Del Skrevet 13. april (endret) 1 hour ago, tingo said: Ja, det lar seg gjøre. Du bør lese man-siden for test ('['): https://ss64.com/bash/test.html Desverre er det ingen av eksemplene på den siden som gjelder funksjonskall. Edit: fikk misstanke om at feilen ligger i en av funksjonene slik at disse alltid returnerer 0. Endret 13. april av geir__hk Lenke til kommentar
Phantom Software Skrevet 13. april Del Skrevet 13. april Du kan vel ta vare på returverdiene i variabler og så bruke if/and sjekken din på disse? Lenke til kommentar
geir__hk Skrevet 13. april Forfatter Del Skrevet 13. april (endret) 19 minutes ago, Phantom Software said: Du kan vel ta vare på returverdiene i variabler og så bruke if/and sjekken din på disse? Ja det er det jeg prøver på. Returverdier er tallverdi 0 eller 1. Nå sliter jeg også med noe annet grunnleggende - om linjene som skal utføres under en if-statement må defineres i {} blokk. Problemet synes å være vage svar på diverse nettsteder. Holder på å lage et skyggescript som jeg kan laste opp - så noen forhåpentligvis ser feilene jeg er blind for. [edit] Her er scriptet i sin helhet #!/bin/bash username=$(whoami) thisComputerHostname=$(hostname) function staticControlUsername () { if [ $username != 'geir' ]; then echo 'WARNING: Pohibited from running, not logged in as correct user' echo 'Your login name ' $username return 0 else echo 'INFO: User granted to run script (test 1)' echo 'Your login name ' $username return 1 fi } function staticControlMachineName () { if [ $thisComputerHostname != 'resirkulert-Acer' ]; then echo 'WARNING: Pohibited from running, the computer name are incorrect' echo 'Current computer name:' $thisComputerHostname return 0 else echo 'INFO: User granted to run script (test 2)' echo 'Name of current computer:' $thisComputerHostname return 1 fi } # Those function call gives error when executed #if [ staticControlUsername -a staticControlMachineName ]; then #if [ staticControlUsername -eq 1 -a staticControlMachineName -eq 1 ]; then #if [ [ staticControlUsername ] -a [ staticControlMachineName ] ]; then # This returns 'Looks good' when executed, but doesn't print echo from within the functions, indicating # that the functions isn't actually executed.' if [ staticControlUsername ] && [ staticControlMachineName ] ; then echo 'Looks good' else echo 'At least one test failed...' fi Endret 13. april av geir__hk Lenke til kommentar
geir__hk Skrevet 13. april Forfatter Del Skrevet 13. april Da har jeg funnet første feil (med hjelp av annet Linux forum). Uttrykk inne i firkantparantes evaluerer uttrykket istedet for returverdi til funksjon. Etter at jeg slettet firkantparantesene, ser scriptet ut til å kjøre - men kjører fremdeles feil: Linje 12 og 13 kjører som forventet. Forventer at Linje 39 skal utføres, men det er linje 41 utføres. Linje 24 og 25 forventes utføres men gjør det ikke. Heller ikke linje 20/21 utføres. Sammendrag: Scriptet utføres som om funksjonen hadde returnert 0, noe som ikke skulle være tilfelle. Når jeg tester funksjonene enkeltvis - uten bruk av logisk og/eller - fungerer testene uten problemer både på riktig og feil brukernavn/maskinnavn. Lenke til kommentar
HawP Skrevet 13. april Del Skrevet 13. april staticControlUsername ruser=$? staticControlMachineName rmach=$? if [ $ruser -eq 1 ] && [ $rmach -eq 1 ]; then Og trenger ikke { } for kommandoer/statements mellom if og elif/else/fi Lenke til kommentar
geir__hk Skrevet 13. april Forfatter Del Skrevet 13. april Ja, jeg tenkte å mellomlagre som variabel, hadde sikkert vært enklest. Men - nå vet jeg hva som var feilen. I uttrykket (etter at jeg hadde endret første gang): if ( staticControlUsername && staticControlMachineName ) ; then så blir ikke oppkallet til funksjonen tolket som logisk sann eller usann på samme måte som jeg tidligere har vært vant til gjennom vbs eller Autohotkey script. I bash fungerer det på samme måte som ved oppkall til en hvilken som helst kommando som returnerer errorlevel - når errorlevel er 0, anses kommandoen som utført ok, og 1 eller høyere hvis kommandoen avslutter og noe er galt. Dermed kreves det at jeg måtte bytte om på return 1 og return 0 for at scriptet skulle fungere. Lenke til kommentar
Phantom Software Skrevet 13. april Del Skrevet 13. april 4 hours ago, geir__hk said: Da har jeg funnet første feil (med hjelp av annet Linux forum). Sjekk ut Warp som terminal i Linux. Da kan du få direkte hjelp av AI med alle disse problemene i stedet for å vente på svar fra forum, om du vil: https://app.warp.dev/get_warp Lenke til kommentar
geir__hk Skrevet 13. april Forfatter Del Skrevet 13. april 2 minutes ago, Phantom Software said: Sjekk ut Warp som terminal i Linux. Da kan du få direkte hjelp av AI med alle disse problemene i stedet for å vente på svar fra forum, om du vil: https://app.warp.dev/get_warp Takk for tipset - godt mulig jeg tar en kikk når jeg får tid. Nå skulle jeg bare lage et enkelt skript for å sjekke at riktig bruker og maskin før rsync starter. Min løsning er at etterhvert som jeg kommer opp mot problemer, så skriver jeg det opp i en slags egen kunnskapsbase - bruker Cherrytree til dette formålet. Og nå har det akkurat blitt laget en ny node for direkte oppkall av funksjoner inne i if statements, så finner jeg det igjen neste gang jeg skal gjøre det samme Lenke til kommentar
mobile999 Skrevet 13. april Del Skrevet 13. april (endret) geir__hk skrev (11 timer siden): Men - i bash får jeg denne feilmeldingen når jeg prøver å kjøre bash-fila: line 47: [: staticControlUsername: integer expression expected Har du forsøkt å kommentere vekk echo linjene i funksjonene? Endret 13. april av mobile999 Lenke til kommentar
geir__hk Skrevet 13. april Forfatter Del Skrevet 13. april 49 minutes ago, mobile999 said: Har du forsøkt å kommentere vekk echo linjene i funksjonene? Jupp - nå når testen er over og scriptet fungerer så trenger jeg jo ikke disse lenger Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå