198 lines
5.2 KiB
Plaintext
198 lines
5.2 KiB
Plaintext
|
Scripting Documentation
|
||
|
-----------------------
|
||
|
This document provides a brief introduction to the script facilities of the shell.
|
||
|
|
||
|
|
||
|
Command line arguments
|
||
|
----------------------
|
||
|
Variables can be passed to a script from the command line and accessed with
|
||
|
$num where num is the number of the shell script variable. The number of
|
||
|
command line variables is given by the $# variable.
|
||
|
|
||
|
|
||
|
Comments
|
||
|
--------
|
||
|
Text following a # on a line is deemed a comment.
|
||
|
|
||
|
|
||
|
Data types
|
||
|
----------
|
||
|
At the moment, the shell only supports primitive types such as integers, booleans, and strings.
|
||
|
|
||
|
|
||
|
Variables
|
||
|
---------
|
||
|
Variables can be assigned to with a simple assignment construct.
|
||
|
For instance, a = 'bc' assigns the string 'bc' to the variable a.
|
||
|
Variables can be referenced by preceding the name with $ (e.q. echo $a)
|
||
|
or with ${name} to separate the reference from surround text such as
|
||
|
b = "surrounding${var}text". References to variables that have not been
|
||
|
previously assigned are considered an error. An error message is printed
|
||
|
and script execution is halted.
|
||
|
|
||
|
|
||
|
Operators
|
||
|
---------
|
||
|
|
||
|
integer: *, / , %, +, -
|
||
|
string: . (concatenation)
|
||
|
boolean: ||, &&, !
|
||
|
comparison: <, <=, ==, >=, >.
|
||
|
|
||
|
The integer operations coerce the
|
||
|
operand types to ints. Therefore, "5" + "9" will call
|
||
|
Int32.ParseInt() on both of these arguments. If one of the operands
|
||
|
to an integer operator is boolean than true is converted to 1
|
||
|
and false is converted to 0.
|
||
|
|
||
|
String operators will call ToString on the value for an operand.
|
||
|
|
||
|
Boolean operators: coerce operand types to booleans. In the case
|
||
|
of integers, an integer equal to 0 is false while all other values
|
||
|
are equivalent to true. For strings, a value is only coercible
|
||
|
if it is either one of Boolean.TrueString (true) or Boolean.FalseString (false)
|
||
|
(case-insensitive).
|
||
|
|
||
|
|
||
|
Comparison:
|
||
|
Currently, comparison operators coerce both operands to the type of the left operand
|
||
|
using the methods described thus far.
|
||
|
Stricter and more sensible typing may be implemented in the future.
|
||
|
|
||
|
|
||
|
Expressions
|
||
|
-----------
|
||
|
Expressions can be constructed from variables, any of the basic primitive
|
||
|
types and the set of operators.
|
||
|
|
||
|
|
||
|
Control Flow
|
||
|
------------
|
||
|
Language currently supports if, if-else, and while. The conditions to these constructs
|
||
|
are arbitrary expressions that successfully evaluate to a boolean value. Bracing of the statements
|
||
|
for these constructs is required to eliminate ambiguity.
|
||
|
|
||
|
|
||
|
Commands
|
||
|
--------
|
||
|
Unfortunately, commands currently consist of a sequence of alpha-numeric words, a string
|
||
|
literal, interpolation, or integer ending in a new line. Therefore and non-alpha-numeric characters (i.e. %)
|
||
|
must be either placed in a string or interpolation. Hopefully, this will eventually change.
|
||
|
|
||
|
|
||
|
Exit and Exit codes
|
||
|
-----------
|
||
|
The exit status of the last command is given by the $? variable.
|
||
|
The built-in exit command takes optionally one integer argument indicating
|
||
|
the exit code of the script execution. If no argument is specified, the status
|
||
|
of the last executed command is returned. If no argument is given and no
|
||
|
commands have been executed, then 0 is returned. This exit builtin differs from
|
||
|
that of the shell prompt. That version performs a shutdown while this
|
||
|
exits the script.
|
||
|
|
||
|
|
||
|
|
||
|
Grammar
|
||
|
-------
|
||
|
SCRIPT => STMT_LIST
|
||
|
|
||
|
STMT_LIST => STMT
|
||
|
| STMT STMT_LIST
|
||
|
|
||
|
STMT => while( E ) { STMT_LIST }
|
||
|
| if( E ) { STMT_LIST }
|
||
|
| if( E ) { STMT_LIST } else { STMT_LIST }
|
||
|
| var = E newline
|
||
|
|
||
|
|
||
|
E => integer_literal | string_literal | bool_literal | variable_reference | interpolation
|
||
|
| E + E | E - E | E * E | E % E |
|
||
|
| E < E | E <= E | E == E | E >= E | E > E
|
||
|
| E . E
|
||
|
| E && E | E || E | !E
|
||
|
|
||
|
|
||
|
COMMAND_LINE=> COMMAND_LIST newline
|
||
|
|
||
|
COMMAND_LIST => COM
|
||
|
| COM COMMAND_LIST
|
||
|
|
||
|
COM => word
|
||
|
| variable_reference
|
||
|
| integer_literal
|
||
|
| string_literal
|
||
|
| interpolation
|
||
|
|
||
|
Example (test script from Shell.sg )
|
||
|
------------------------------------
|
||
|
echo $2 #echo second argument
|
||
|
decho $2
|
||
|
echo number of arguments '=' $#
|
||
|
decho number of arguments '=' $#
|
||
|
|
||
|
echo last command exit code '=' $?
|
||
|
decho last command exit code '=' $?
|
||
|
if (true) {
|
||
|
variable = false
|
||
|
if ($variable) {
|
||
|
var2 = true
|
||
|
echo broken conditional
|
||
|
decho broken conditional
|
||
|
}
|
||
|
else {
|
||
|
var2 = true
|
||
|
output1 = "bet${variable}ween"
|
||
|
echo $output1
|
||
|
decho $output1
|
||
|
}
|
||
|
#some comments #
|
||
|
#
|
||
|
decho var2 is $var2
|
||
|
add = -2 + 4
|
||
|
echo '-2 + 4 =' $add
|
||
|
decho '-2 + 4 =' $add
|
||
|
|
||
|
mod = 6 % 5
|
||
|
echo '6 % 5 =' $mod
|
||
|
decho '6 % 5 =' $mod
|
||
|
|
||
|
div = 10 / 5
|
||
|
echo '10 / 5 =' $div
|
||
|
decho '10 / 5 =' $div
|
||
|
|
||
|
mult = 2 * 5
|
||
|
echo '2 * 5=' $mult
|
||
|
decho '2 * 5=' $mult
|
||
|
|
||
|
var1 = 5
|
||
|
var2 = 6
|
||
|
|
||
|
if($var1 < $var2){
|
||
|
decho $var1 is less than $var2
|
||
|
two = 1
|
||
|
power = 10
|
||
|
echo starting loop
|
||
|
decho starting loop
|
||
|
while($power > 0){
|
||
|
two = $(two) * 2
|
||
|
power = $power - 1
|
||
|
}
|
||
|
output2 = "2^10 = $two"
|
||
|
echo $output2
|
||
|
decho $output2
|
||
|
}
|
||
|
if ($var1 > $var2) {
|
||
|
echo $var2 is less than $var1
|
||
|
decho $var2 is less than $var1
|
||
|
}
|
||
|
else {
|
||
|
output3 = 'var1' . " is " . $var1
|
||
|
echo $output3
|
||
|
decho $output3
|
||
|
}
|
||
|
var = "test"
|
||
|
if ("test" == $var) {
|
||
|
echo string compare success
|
||
|
decho string compare success
|
||
|
}
|
||
|
}
|