DefFunc myFunc(val $str1$ : string, $str2$ : string) : string set $result$ = $str1$ + $str2$ endfunc
Wiederverwendbarkeit von Code wird beschränkt durch:
Seit Version 4.12 kennt opsi-script auch lokale Funktionen.
Ein Beispiel:
DefFunc myFunc(val $str1$ : string, $str2$ : string) : string set $result$ = $str1$ + $str2$ endfunc
Ziel dieser Erweiterung ist die Umsetzung folgender Konzepte:
Die Funktionen haben einen Rückgabewert,
welcher vom Typ string oder stringlist ist.
Der Aufruf eine solchen Funktion kann überall da erfolgen,
wo ein Stringausdruck bzw.eine Stringliste erwartet wird.
Einer Funktion können Parameter übergeben werden.
DefFunc myFunc(val $str1$ : string, ref $list$ : stringlist) : string
string oder stringlist sein.CallByValue ist der Default.
val.
CallByReference ist nicht der Default.
ref explizit angegeben werden.Eine Funktion enthält lokale Variablen.
$result$ welche vom Typ des Rückgabewertes ist.
Definition
DefFunc <func name>([calltype parameter type][,[calltype parameter type]]) : type <function body> endfunc
DefFunc das Schlüsselwort zur Beginn der Definition einer lokalen Funktion.
val | ref]. Wird kein Aufruftyp angegeben, + so gilt val als gesetzt.
string oder stringlist;
$result$,
welche den Datentyp der Funktion hat (String/Stringliste) und dazu dient den Rückgabewert aufzunehmen.
endfunc zeigt als Schlüsselwort das Ende einer Funktionsdefinition an.
Einfache Funktion, welche zwei Strings miteinander verbindet:
(defined_functions0.opsiscript)
[actions] DefVar $mystr$ DefVar $str1$ set $str1$ = 'ha' DefFunc myFunc(val $str1$ : string, $str2$ : string) : string set $result$ = $str1$ + $str2$ endfunc set $mystr$ = myFunc("he","ho") set $mystr$ = myFunc("he",timeStampAsFloatStr) set $mystr$ = myFunc("he",$str1$)
Erwartete Ergebnisse:
Funktion vom Type stringlist, welcher ein string und eine stringlist übergeben werden:
(defined_functions1.opsiscript)
[actions] DefVar $mystr$ DefVar $str1$ DefStringlist $list1$ DefStringlist $list2$ set $str1$ = 'ha' DefFunc myFunc1(val $str1$ : string, $list1$ : stringlist) : stringlist set $result$ = createStringlist($str1$ , takeString(2,$list1$)) endfunc set $list2$ = splitstring("/etc/opsi/huhu","/") set $list1$ = myFunc1("hi",$list2$)
Erwartete Ergebnisse:
Funktion vom Type string, welcher ein string übergeben wird:
(defined_functions2.opsiscript)
[actions] DefFunc myFunc2($str1$ : string) : string if $str1$ > "0" set $result$ = "true" else set $result$ = "false" endif endfunc if stringtobool(myfunc2("1")) comment "true" else comment "false" endif
Erwartete Ergebnisse:
Funktion vom Type string, welcher ein string übergeben wird
mit lokaler Variable:
(defined_functions3.opsiscript)
[actions] DefVar $mystr$ DefFunc myFunc3($str1$ : string) : string DefVar $locstr1$ set $locstr1$ = '123' set $result$ = $locstr1$ + $str1$ endfunc set $mystr$ = myFunc3("he")
Erwartete Ergenisse:
Funktion vom Type string, welcher ein string übergeben wird
mit lokaler Variable und geschachtelter Funktion:
(defined_functions4.opsiscript)
[actions] DefVar $mystr$ DefFunc myFunc4($str1$ : string) : string DefVar $locstr1$ DefFunc myFunc5($str1$ : string) : string set $result$ = 'inner' + $str1$ endfunc set $locstr1$ = '123' set $result$ = $str1$ + myFunc5($locstr1$) endfunc set $mystr$ = myFunc4("outer")
Erwartete Ergebnisse:
Einfache Funktion vom Type string, welcher ein string by reference übergeben wird mit lokaler Variable:
(defined_functions6.opsiscript)
[actions] DefVar $mystr$ DefVar $str1$ DefVar $str2$ set $str1$ = 'ha' set $str2$ = 'hi' DefFunc myFunc6(ref $str1$ : string) : string DefVar $locstr1$ set $locstr1$ = '123' set $str1$ = 'setinlocal' set $result$ = $locstr1$ + $str1$ endfunc set $mystr$ = myFunc6($str2$) set $mystr$ = $str1$ + $str2$
Erwartete Ergebnisse:
Funktion vom Type stringlist, welcher eine Variable vom Type stringlist mit call by reference übergeben wird mit lokalen stringlist Variable:
(defined_functions7.opsiscript)
[actions] DefVar $mystr$ DefStringlist $list1$ DefStringlist $list2$ set $list2$ = splitstring("/etc/opsi/huhu","/") DefFunc myFunc7(ref $list1$ : stringlist) : stringlist DefStringlist $loclist1$ set $loclist1$ = splitstring("/a/b/c","/") set $list1$ = createStringList('setinlocal') set $loclist1$ = addListToList($loclist1$,$list1$) set $result$ = $loclist1$ endfunc set $list1$ = myFunc7($list2$) comment "$list2$ index 0: " + takestring(0,$list2$)
Erwartete Ergenisse:
Funktion vom Type stringlist, welcher ein string übergeben wird
mit lokaler Variable und lokaler sekundärer Sektion:
(defined_functions8.opsiscript)
[actions] DefStringlist $list1$ DefFunc myFunc8($str1$ : string) : stringlist DefStringlist $loclist1$ set $loclist1$ = getoutstreamfromsection("shellInAnIcon_test") set $result$ = $loclist1$ [shellinanicon_test] set -x $str1$ endfunc if GetOS = 'Linux' set $list1$ = myFunc8('set -x ; pwd') else set $list1$ = myFunc8('echo %cd%') endif
Erwartete Ergebnisse: Linux: $list1$ = [+ pwd, /home/uib/gitwork/lazarus/opsi-script]
Windows:
The value of the variable "$list1$" is now: (string 0) (string 1)W:\opsi-script-test\CLIENT_DATA\standalone-tests>echo W:\opsi-script-test\CLIENT_DATA\standalone-tests (string 2)W:\opsi-script-test\CLIENT_DATA\standalone-tests
Hier geht es um die Auslagerung von local functions |
importLib <string expr>
Dabei ist <string expr>:
<file name>[.<file extension>][::<function name>]
.opsiscript als Default verwendet.<file name> ist:
%ScriptPath% [W/L]
%opsiScriptHelperPath%\lib [W]%ScriptPath%/../lib //since 4.11.5.2 [W/L]
%WinstDir%\lib [W]
/usr/share/opsi-client-agent/opsi-script/lib [L]
Die Prüfung erfolgt in dieser Reihenfolge. Die erste Datei, die gefunden wird, wird genommen.
Einfache Funktion welche zwei Strings miteinander verbindet:
Die Library Datei myfirstlib.opsiscript:
DefFunc myFunc(val $str1$ : string, $str2$ : string) : string set $result$ = $str1$ + $str2$ endfunc
Das Programm:
(defined_functions_lib1.opsiscript)
[actions] DefVar $mystr$ DefVar $str1$ importLib "%scriptpath%\myfirstlib.opsiscript" set $str1$ = 'ha' set $mystr$ = myFunc("he","ho") set $mystr$ = myFunc("he",timeStampAsFloatStr) set $mystr$ = myFunc("he",$str1$)
Erwartete Ergebnisse:
Die Zeile
importLib "%scriptpath%\myfirstlib.opsiscript"
könnte auch folgende Form haben:
importLib "myfirstlib.opsiscript"%scriptpath% ist im Suchpfad;importLib "myfirstlib".opsiscript ist der Default;importLib "myfirstlib.opsiscript::myFunc"Folgende bekannte Wünsche sind momentan noch offen:
opsi-script Library im opsi-winst Paket
Seit opsi-script 4.12.0.13 enthält das Unterverzeichnis lib Librarydateien,welche von Standard opsi Produkten verwendet werden:
Diese Library wird direkt von uib gepflegt und dient hauptsächlich für interne Zwecke.
Wir starten hiermit |
Namespace:
Damit Funktionen einer Library auch verwendet werden, müssen sie nach Funktion und Syntax auffindbar sein.
Für die Funktionen müssen Tests bereit stehen:
/
#