Gå til innhold

Linux bash - mulig å kalle opp 2 funksjoner for logisk AND


Anbefalte innlegg

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
Videoannonse
Annonse
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 av geir__hk
Lenke til kommentar

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

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
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
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 av mobile999
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...