Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
soc:2009:lynusvaz:notes:scripting_doc:features_added [2009/08/07 09:53] lynusvaz |
soc:2009:lynusvaz:notes:scripting_doc:features_added [2009/08/16 00:19] (current) lynusvaz |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | The features mentioned here are NOT YET part of mainline gPXE, and are still under development. The modified code can be found in my git repository, in the [[http://git.etherboot.org/?p=people/lynusvaz/gpxe.git;a=shortlog;h=refs/heads/offset|offset]] branch. | + | =====Scripting Features===== |
- | + | The features mentioned here are NOT YET part of mainline gPXE, and are still under development. The modified code can be found in my git repository, in the [[http://git.etherboot.org/?p=people/lynusvaz/gpxe.git;a=shortlog;h=refs/heads/expt|expt]] branch. | |
- | Scripting features: | + | |
- Identifiers | - Identifiers | ||
- Arithmetic evaluator | - Arithmetic evaluator | ||
- Quoting | - Quoting | ||
+ | - Branches | ||
- Return code | - Return code | ||
- | - Branches | ||
- Loops | - Loops | ||
- | 1. See the Identifiers section at: [[http://etherboot.org/wiki/commandline]], for the basic syntax of an identifier. The new code allows identifiers to be 'nested', like: | + | ====Identifiers==== |
+ | See the Identifiers section at: [[http://etherboot.org/wiki/commandline]], for the basic syntax of an identifier. The new code allows identifiers to be 'nested', like: | ||
set i 0 | set i 0 | ||
echo ${net${i}/ip} | echo ${net${i}/ip} | ||
Line 18: | Line 18: | ||
echo ${net$(${i}+1)/ip} | echo ${net$(${i}+1)/ip} | ||
will print the IP address of the net1 interface (if it exists). | will print the IP address of the net1 interface (if it exists). | ||
- | Identifiers are expanded by placing them within ${}. | ||
- | E.g.: | ||
- | echo $(1 + 2) | ||
- | set a 15 | ||
- | echo $(${a} * 3 + 5) | ||
- | echo $( ${net0/ip} != "" ) | ||
- | Output: | ||
- | 3 | ||
- | 50 | ||
- | 1 | ||
- | 2. Arithmetic expressions can be evaluated by placing them within $(). | + | ====Arithmetic Evaluation==== |
- | The usual C operators (except assignment) are supported with their usual precendence: | + | Arithmetic expressions can be evaluated by placing them within $(). |
- | Operators, in order of decreasing precedence: | + | The following operators are supported (in order of decreasing precedence): |
- !, ~ (logical NOT and bitwise negation) | - !, ~ (logical NOT and bitwise negation) | ||
- *, /, % (multiplication, division, and modulo) | - *, /, % (multiplication, division, and modulo) | ||
Line 43: | Line 33: | ||
- && (logical AND) | - && (logical AND) | ||
- || (logical OR) | - || (logical OR) | ||
- | The == and != operators also act on strings. | + | The == and != operators also act on strings. Identifiers are expanded by placing them within ${}. |
+ | E.g.: | ||
+ | echo $(1 + 2) | ||
+ | set a 15 | ||
+ | echo $(${a} * 3 + 5) | ||
+ | echo $( ${net0/ip} != "" ) | ||
+ | Output: | ||
+ | 3 | ||
+ | 50 | ||
+ | 1 | ||
- | 3. Quoting: | + | ====Quoting==== |
The \ is used as an escape character. The following sequences are recognised: | The \ is used as an escape character. The following sequences are recognised: | ||
* \<space> Treats the space as part of the command-line argument | * \<space> Treats the space as part of the command-line argument | ||
Line 51: | Line 50: | ||
* \<newline> Concatenates the next line to the current line. Both the \ and the newline character are removed | * \<newline> Concatenates the next line to the current line. Both the \ and the newline character are removed | ||
* \<any other character> Removes the special meaning of the character (if any) | * \<any other character> Removes the special meaning of the character (if any) | ||
- | + | Within single-quotes, all characters lose their special meaning. Within double-quotes, the \ and $ retain their special meaning. Single- and double-quotes allow you to use a newline character in a command-line argument. | |
- | Within single-quotes, all characters lose their special meaning. Within double-quotes, the \ and $ retain their special meaning. | + | |
E.g.: | E.g.: | ||
- | set message 'Hello World' | + | set message "Hello World" |
echo '${message} = '${message} | echo '${message} = '${message} | ||
set message Hello\ \ World | set message Hello\ \ World | ||
Line 60: | Line 58: | ||
set message Hello\ World\ \#1 #'Hello World #1' is treated as a single argument | set message Hello\ World\ \#1 #'Hello World #1' is treated as a single argument | ||
echo ${message} | echo ${message} | ||
- | echo 'Hello | + | echo 'Hello |
- | World' | + | World' # Will introduce a newline between Hello and World |
echo Hello \ | echo Hello \ | ||
World | World | ||
Line 71: | Line 69: | ||
Hello | Hello | ||
World | World | ||
+ | Hello World | ||
It's good to see you! | It's good to see you! | ||
- | 4. The return code of the previous statement can be checked using the ${rc} variable. | + | ====Branches==== |
- | A value of 0 means that the command completed successfully, while any other value means the command was not successful. | + | |
- | + | ||
- | 5. Branches: | + | |
The keywords if, else and fi are used to branch command execution: | The keywords if, else and fi are used to branch command execution: | ||
if <condition> | if <condition> | ||
Line 94: | Line 90: | ||
<backup statements> #Call this statement sequence B | <backup statements> #Call this statement sequence B | ||
done | done | ||
- | The statements in sequence A are executed one by one. If any of them fails, execution branches immediately to sequence B. If all the statements in sequence A are executed successfully, execution skips sequence B. | + | The statements in sequence A are executed one by one. If any of them fails, execution branches immediately to sequence B. If all the statements in sequence A are executed successfully, execution skips sequence B, and continue after the done statement. |
E.g.: | E.g.: | ||
- | if $( ${filename} == "" && ${server} != "") | + | if $( ${filename} != "" && ${server} != "") |
- | echo "No filename" | + | |
- | else | + | |
chain tftp://${server}//${filename} | chain tftp://${server}//${filename} | ||
+ | else | ||
+ | echo "No filename" | ||
fi | fi | ||
+ | will first check that neither filename and server are not empty, before attempting to boot. If either is empty, display an error message. | ||
try | try | ||
Line 110: | Line 107: | ||
echo "Oops: ${rc}" | echo "Oops: ${rc}" | ||
done | done | ||
+ | will attempt to boot using the given kernel and initrd. If any of the three commands fail, it displays a message. | ||
- | 6. While and for loops have been added: | + | ====Return Code==== |
+ | The return code of the previous statement can be checked using the ${rc} variable. | ||
+ | A value of 0 means that the command completed successfully, while any other value means the command was not successful. | ||
+ | |||
+ | E.g.: | ||
+ | dhcp net0 | ||
+ | if $( ${rc} != 0 ) | ||
+ | echo "DHCP failed" | ||
+ | else | ||
+ | chain http://etherboot.org/gtest/gtest.gpxe # (Tom's Root Boot disk) | ||
+ | fi | ||
+ | |||
+ | ====Loops==== | ||
+ | You can use while and for loops as: | ||
while <condition> | while <condition> | ||
do | do | ||
Line 134: | Line 145: | ||
set i $( ${i} + 1 ) | set i $( ${i} + 1 ) | ||
done | done | ||
+ | will attempt to get a dhcp connection on each valid interface, and if it is successful, boot using a given file. | ||
- | for i in 0 1 2 3 $(3 + 1) 5 | + | for i in 0 1 2 3 5 $(6*3) |
do | do | ||
- | dhcp net${i} | + | echo 'i =' ${i} |
- | if $(${rc} == 0) | + | |
- | chain tftp://${server}//${filename} | + | |
- | fi | + | |
done | done | ||
+ | displays: | ||
+ | i = 0 | ||
+ | i = 1 | ||
+ | i = 2 | ||
+ | i = 3 | ||
+ | i = 5 | ||
+ | i = 18 | ||
+ | A break statement will exit a loop, and a continue statement will start the next iteration of the loop. | ||
+ | for i in 1 2 3 4 5 6 | ||
+ | do | ||
+ | if $(${i} == 3) | ||
+ | continue | ||
+ | fi | ||
+ | echo 'i =' ${i} | ||
+ | if $(${i} == 4) | ||
+ | break #This will exit the for loop, not just the if branch | ||
+ | fi | ||
+ | done | ||
+ | displays: | ||
+ | i = 1 | ||
+ | i = 2 | ||
+ | i = 4 | ||