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
Next revision Both sides next 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:12]
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)