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:
/
#