This page is for brainstorming a scripting language for gPXE. Feel free to edit to your heart's delight - everything should be versioned by the wiki anyway!
=== Commands ===
The current gPXE shell strips whitespace from a line and splits into an ''argv[]'' array:
command [arg1 [arg2 [arg3 ...]]]
=== Variables ===
Currently, settings like the IP address and boot filename are available as variables. In the future, scripts should be able to create temporary variables as scratch space.
set net0/ip 192.168.0.1
set my_ip 10.0.0.15
show net0/netmask
clear net0/gateway
Variable expansion is already available in mainline gPXE:
dhcp ${my_iface}
initrd http://etherboot.org/initrds/${node_id}.bz2
"References" could work like this:
set ref_to_ip net0/ip
show ${ref_to_ip}
=> ...value of net0/ip...
=== Arithmetic ===
Standard arithmetic operators should work for integral types:
set i ${(i / 2 + 1) * 2}
The operators are: ''+'', ''-'', ''*'', ''/'', ''%'', ''('', and '')''.
=== String manipulation ===
The format string built-in function allows string concatentation and formatting:
set net0/ip ${fmt("%d.%d.%d.%d", 192, 168, 0, 10 + host_num)}
=== Comparison and logic ===
The standard operators for integral and string types (string ordering probably isn't necessary though):
== != < > <= >=
They should either evaluate to special boolean values "true"/"false", or we need to define truth rules for all types (e.g. integral types are true if not equal to zero).
=== Control flow ===
The only control flow statement is the ''if'' statement:
if goto
For example:
set i 0
loop:
dhcp net${i}
kernel ${kernel_url}
boot
set i ${i + 1}
if ${i < $iface_count} goto loop
=== Needs discussion ===
* We probably need an exit code built-in variable like ''$?'' in POSIX shell.
* Bitwise operators ''|'', ''&'', ''^'', ''~'', ''<<'', and ''>>'' may be needed.
* Focus needs to be on what we can leave out rather than what to add.
* More use cases so we know what users need.
=== Links ===
* [[http://bellard.org/otcc/|Obfuscated Tiny C Compiler]]
* [[http://www.nicholson.com/rhn/files/dds_basic.c|TINY obfuscated C BASIC interpreter]]
* [[http://www.ittybittycomputers.com/IttyBitty/TinyBasic/TinyBasic.c|TinyBasic]]
* [[http://www.personal.leeds.ac.uk/~bgy1mm/Minibasic/basic.c|Mini BASIC]]