Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
soc:2009:lynusvaz:notes:scripting_doc:features_added [2009/08/05 09:37]
lynusvaz
soc:2009:lynusvaz:notes:scripting_doc:features_added [2009/08/16 00:19]
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
-  - Return code 
   - Branches   - Branches
 +  - Return code
   - 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}
-will print the IP address of the net0 interface.+will print the IP address of the net0 interface. Arithmetic operations (see 2) can also be performed within the ${}: 
 +E.g.: 
 +  set i 0 
 +  echo ${net$(${i}+1)/​ip} 
 +will print the IP address of the net1 interface (if it exists).
  
-2. Arithmetic expressions can be evaluated by placing them within $(). +====Arithmetic Evaluation==== 
-The usual C operators ​(except assignment) ​are supported ​with their usual precendence. Alsostring comparison is permitted. +Arithmetic expressions can be evaluated by placing them within $(). 
-Identifiers are expanded by placing them within ${}.+The following ​operators are supported ​(in order of decreasing precedence):​ 
 +  - !~          (logical NOT and bitwise negation) 
 +  - *, /, %       ​(multiplication,​ division, and modulo) 
 +  - +, -          (addition, subtraction) 
 +  - <<, >> ​       (left- and right-shift) 
 +  - <, <=, >, >=  (inequality) 
 +  - !=, ==        (equal, not equal) 
 +  - &             ​(bitwise AND) 
 +  - |             ​(bitwise OR) 
 +  - ^             ​(bitwise EX-OR) 
 +  - && ​           (logical AND) 
 +  - ||            (logical OR) 
 +The == and != operators also act on strings. ​Identifiers are expanded by placing them within ${}.
 E.g.: E.g.:
   echo $(1 + 2)   echo $(1 + 2)
Line 23: Line 39:
   echo $(${a} * 3 + 5)   echo $(${a} * 3 + 5)
   echo $( ${net0/ip} != ""​ )   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 
-\<​tab>​ Ditto +  ​* ​\<​tab>​ Ditto 
-\<​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 
-\\ A literal \ +  ​* ​\<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
 +  echo ${message}
   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 'Hello  +  ​echo ${message} 
-  World'+  ​echo '​Hello 
 +  World' ​ # Will introduce a newline between Hello and World
   echo Hello \   echo Hello \
   World   World
   echo It\'s good to see you!   echo It\'s good to see you!
 +Output:
 +  ${message} = Hello World
 +  Hello  World
 +  Hello World #1
 +  Hello
 +  World
 +  Hello World
 +  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 65: 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.+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} ​== ""​+  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 81: 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.
  
-6While 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 105: 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 + 15+  for i in 0 1 2 3 $(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
  

QR Code
QR Code soc:2009:lynusvaz:notes:scripting_doc:features_added (generated for current page)