Sida 1 av 1
Funktioner i sh och bash
Postat: 07 feb 2009, 18:48
av Johnny Rosenberg
Har letat efter information om detta på nätet och hittat en hel del intressant läsning, men det känns ändå som att lite inte gått in i min lilla trånga hjärna. Formen för en funktion tycks ju vara:
Kod: Markera allt
function-name ( )
{
command1
command2
.....
...
commandN
return
}
Vad jag funderar på är dock vad den tomma parentesen är till för. Det verkar ju aldrig stå något i den, så varför inte bara skippa den? Är det bara för att indikera att det rör sig om en funktion? Som om inte det skulle framgå ändå…
För vad jag tolkar det jag läst om, så fungerar funktioner på samma sätt som hela skript, att parametrar lägger sig i $1, $2 och så vidare, eller har jag missuppfattat det också?
Har nämligen tänkt att omarbeta ett skript jag har och tänkte göra det mer lättläst genom att skapa ett antal funktioner som jag sedan anropar, precis som man alltid gör i exempelvis C.
Re: Funktioner i sh och bash
Postat: 07 feb 2009, 19:28
av Lars
Om det inte vore några parenteser där så skulle det tolkas som ett anrop till en funktion (eller ett kommando).
Re: Funktioner i sh och bash
Postat: 07 feb 2009, 19:46
av Konservburk
Johnny Rosenberg skrev:Vad jag funderar på är dock vad den tomma parentesen är till för. Det verkar ju aldrig stå något i den, så varför inte bara skippa den? Är det bara för att indikera att det rör sig om en funktion? Som om inte det skulle framgå ändå…
Lars har rätt. Jämför ...
... med samma kod utan () ...
... så inser du förhoppnigsvis varför () behövs för att det ska framgå att det rör sig om en funktion. Det går dock att utelämna () i vissa fall om man istället skriver
function framför funktionsnamnet, men då fungerar det inte med sh.
Johnny Rosenberg skrev:För vad jag tolkar det jag läst om, så fungerar funktioner på samma sätt som hela skript, att parametrar lägger sig i $1, $2 och så vidare, eller har jag missuppfattat det också?
Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Re: Funktioner i sh och bash
Postat: 07 feb 2009, 22:38
av Johnny Rosenberg
Konservburk skrev:Johnny Rosenberg skrev:Vad jag funderar på är dock vad den tomma parentesen är till för. Det verkar ju aldrig stå något i den, så varför inte bara skippa den? Är det bara för att indikera att det rör sig om en funktion? Som om inte det skulle framgå ändå…
Lars har rätt. Jämför ...
... med samma kod utan () ...
... så inser du förhoppnigsvis varför () behövs för att det ska framgå att det rör sig om en funktion. Det går dock att utelämna () i vissa fall om man istället skriver
function framför funktionsnamnet, men då fungerar det inte med sh.
Tänkte faktiskt inte på att raden faktiskt inleds med själva funktionsnamnet. Men då är det ju logiskt, även om jag nog hade föredragit formen med ordet function för att indikera att det rör sig om en funktion. Fast ännu hellre hade jag ju sett att sh-skript skrivs exakt som C eller C++, men man kan inte få allt. Csh och tsch är i ju och för sig ett steg närmare C om jag inte minns fel från början av 90-talet då det var just tsch som gällde för min del. Stör mig nämligen lite på det där med att man avslutar saker med satsens namn baklänges: if-fi, while-elihw och så vidare. Vad är det för fel på endif och endwhile eller rent av bara end? Eller bara while(…){ … } som i C.
Konservburk skrev:Johnny Rosenberg skrev:För vad jag tolkar det jag läst om, så fungerar funktioner på samma sätt som hela skript, att parametrar lägger sig i $1, $2 och så vidare, eller har jag missuppfattat det också?
Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Okej, det var ju egentligen så jag menade.
Är dessa variabler lokala, så att de enbart existerar inuti funktionen?
Re: Funktioner i sh och bash
Postat: 07 feb 2009, 23:48
av Konservburk
Johnny Rosenberg skrev:Stör mig nämligen lite på det där med att man avslutar saker med satsens namn baklänges: if-fi, while-elihw och så vidare. Vad är det för fel på endif och endwhile eller rent av bara end? Eller bara while(…){ … } som i C.
Nu tycker jag att du överdriver lite. Det är bara
if-fi och
case-esac som finns. Just den biten är en rest från AGOL68. När det gäller
while och
for så är det
do-done som grupperar. Men det går faktiskt att använda krullparenteser istället, åtminstone i vissa fall (dock inte med just ubuntus version av sh, trots att det fungerar med såväl orginalet från 70-talet som med bash):
När vi ändå är inne på funktioner och udda syntax kan jag inte låta bli att ta upp följande exempel:
Johnny Rosenberg skrev:Konservburk skrev:Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Okej, det var ju egentligen så jag menade.
Är dessa variabler lokala, så att de enbart existerar inuti funktionen?
Ja, de är lokala. Skriptets egna $1 och $2 skrivs inte över. De kommer tillbaka när funktionen är klar. Men till skillnad från hur det är med separata skript så är andra (vanliga) variabler inte lokala om du inte uttryckligen ber om det.
Re: Funktioner i sh och bash
Postat: 08 feb 2009, 03:54
av Johnny Rosenberg
Konservburk skrev:Nu tycker jag att du överdriver lite. Det är bara if-fi och case-esac som finns. Just den biten är en rest från AGOL68. När det gäller while och for så är det do-done som grupperar.
Ja, det har du rätt i. Jag blandar ihop det på något sätt, för jag är säker på att jag sett ”elihw” i något sammanhang. Nåja, vi lämnar väl det då.
Konservburk skrev:Men det går faktiskt att använda krullparenteser istället, åtminstone i vissa fall (dock inte med just ubuntus version av sh, trots att det fungerar med såväl orginalet från 70-talet som med bash):
När vi ändå är inne på funktioner och udda syntax kan jag inte låta bli att ta upp följande exempel:
Johnny Rosenberg skrev:Konservburk skrev:Funktioner fungerar inte på samma sätt som hela skript annat än just med $1, $2, osv.
Okej, det var ju egentligen så jag menade.
Är dessa variabler lokala, så att de enbart existerar inuti funktionen?
Ja, de är lokala. Skriptets egna $1 och $2 skrivs inte över. De kommer tillbaka när funktionen är klar. Men till skillnad från hur det är med separata skript så är andra (vanliga) variabler inte lokala om du inte uttryckligen ber om det.
Okej, får försöka ta reda på hur man gör det då, om jag kommer att behöva det.
Sedan har jag sett i en del skript att det står exempelvis:
Det verkar som att det är ett sätt att göra variablen global. Det känner jag att det kan vara användbarti vissa sammanhang. Finns det något sätt att ”utplåna” en global variabel också?
Re: Funktioner i sh och bash
Postat: 08 feb 2009, 15:15
av Konservburk
Johnny Rosenberg skrev:Konservburk skrev:Ja, de är lokala. Skriptets egna $1 och $2 skrivs inte över. De kommer tillbaka när funktionen är klar. Men till skillnad från hur det är med separata skript så är andra (vanliga) variabler inte lokala om du inte uttryckligen ber om det.
Okej, får försöka ta reda på hur man gör det då, om jag kommer att behöva det.
Enklast är att lägga funktionen i ett subskal.
Johnny Rosenberg skrev:Sedan har jag sett i en del skript att det står exempelvis:
Det verkar som att det är ett sätt att göra variablen global. Det känner jag att det kan vara användbarti vissa sammanhang. Finns det något sätt att ”utplåna” en global variabel också?
Variabler som markerats med
export följer med till separata skript och andra program. Men det behövs inte när det gäller funktioner eftersom alla vanliga variabler i det fallet följer med ända. Du kan avmarkera med
export -n om du nu skulle vilja det.