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/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.
  
-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 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 + 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)