======Variables======
xmlsh variables can be either strings or XML types (infoset, including sequences).
There is no limit to the size of variables besides JVM memory.
Variables are created using variable assignment ([[Variables]]). The type of the expression determins
if a variable is a string or XML variable. Variables can be re-assigned and this can change their type.
Example of string assignments
%%(shell)
A=string
A="string"
A='string'
B="another $A"
C=${B}
D=$(echo yet more strings)
E=$(ls)
%%
Example of XML assignments
%%(shell)
A=<[]>
A=<[1,2,3,bar]>
A=$<(xls)
DOC=<[text]>
T=<[{$DOC//bar}]>
%%
====Sequence Construction====
Variable assignment supports a simplified sequence expression, similar to bash and ksh array assignment.
var=(elem elem ...)
For example
%%
$ var=(foo bar spam)
%%
Assigns an XML sequence of strings equivilent to
%%
$ var=<[("foo","bar","spam")]>
%%
The values inside () are expanded using Word expansion and Globbing before being assigned.
Note that this is different then non-sequence construction which doesn't do globbing (wildcard expansion).
Assuming there are 21 xml files in the current directory
%%
$ var=(*.xml)
$ echo <[ count($var) ]>
21
$ var=*.xml
$ echo <[ count($var) ]>
1
%%
Assigns var to be the sequence containing all xml files in the current directory.
The empty sequence construct creates an empty sequence. This is different then string assignment which creates a empty string.
%%
var=()
echo <[count($var)]>
%%
returns
%%
0
%%
%%
var=""
echo <[count($var)]>
%%
Returns
%%
1
%%
====Sequence Append====
Sequences can be appended using the syntax
%%
VAR+=value
%%
This is a syntax shortcut for
%%
VAR=($VAR,value)
%%
or
%%
VAR=<[ $VAR , value ]>
%%
If the variable doesn't exist it is created as if assigned using =.
Example: Create a sequence of integers 1 to 10 then append 20 to 30
%%
A=<[ 1 to 10 ]>
A+=<[ 20 to 30 ]>
echo $A
%%
Result
%%
1 2 3 4 5 6 7 8 9 10 20 21 22 23 24 25 26 27 28 29 30
%%
Example Create an element then append to it
%%
A=<[ text ]>
A+=<[ text ]>
xecho $A
%%
Result
%%(xml)
text
text
%%
====Array Notation====
xmlsh supports a simplified version of the bash array notation in variable expansion.
The expression ${variable[index]} expands to the index'd element of a sequence variable. Index starts at 1 for compatibility with xpath expressions. ${variable[index]} is equivalent to <[ $variable[index] ]>.
The expression ${#variable} expands to the sequence length of variable. ${#variable} is equivalent to <[ count($variable) ]>
A non-sequenced variable is equivalent to a sequenced variable of length 1.
Unlike bash, sparse arrays are not supported because array notation is just a syntactic simplification over the XML infoset sequence variables which cannot be sparse.
Examples
%%
var=(foo bar spam)
echo ${#var}
echo ${var[2]}
%%
returns
%%
3
bar
%%
%%
var=<[ "foo" , text , 1 , 2 , 3 ]>
echo ${#var}
xecho ${var[2]}
%%
returns
%%
5
text
%%
====Tied Variables====
See the [[CommandTie tie]] command for how to tie xquery expressions to variables.
----
See Also [[BasicSyntax Basic Syntax]]
See Also [[CommandTie tie]]
See Also [[BuiltinVariables Builtin Variables]]