Warning, /frameworks/syntax-highlighting/data/syntax/zsh.xml is written in an unsupported language. File is not indexed.

0001 <?xml version="1.0" encoding="UTF-8"?>
0002 <!DOCTYPE language
0003 [
0004         <!ENTITY tab      "&#009;">
0005         <!ENTITY funcname "[^&_fragpathseps;=]*+">
0006         <!ENTITY varname  "[A-Za-z_][A-Za-z0-9_]*">
0007         <!ENTITY eos      "(?=$|[ &tab;])">                 <!-- eol or space following -->
0008         <!ENTITY eoexpr   "(?=$|[ &tab;&lt;>|&amp;;)])">
0009 
0010         <!ENTITY substseps  "${}'&quot;`\\">
0011         <!ENTITY symbolseps "&lt;>|&amp;;()">
0012         <!ENTITY wordseps   " &tab;&symbolseps;">
0013         <!ENTITY wordseps_or_extglog " &tab;>|&amp;;)`"> <!-- wordseps without < and ( -->
0014 
0015         <!ENTITY bq_string  "`[^`]*+`">
0016         <!ENTITY sq_string  "'[^']*+'">
0017         <!ENTITY dq_string  "&quot;(?:[^&quot;\\`]*+|&bq_string;|\\.)*+&quot;">
0018         <!ENTITY strings    "(?:&sq_string;|&dq_string;|&bq_string;)">
0019 
0020         <!ENTITY simpleglob "*?#^~">
0021         <!ENTITY globrange  "&lt;[0-9]*-[0-9]*>">
0022         <!ENTITY globany    "\[(?:[^&wordseps;&quot;'`\\\[\]]+|\\.|&strings;|\[:\w+:\]|\[)*\]">
0023 
0024         <!ENTITY _fragpathseps  "&simpleglob;[&wordseps;&substseps;">
0025         <!ENTITY _fragpathnosep "(?:&_brace_noexpansion;)?+">
0026         <!ENTITY path        "(?:[^&_fragpathseps;]*+&_fragpathnosep;)*+">
0027         <!ENTITY fragpath    "(?:[^&_fragpathseps;/]*+&_fragpathnosep;)*+">
0028         <!ENTITY fragpathesc "\\.(?:[^&_fragpathseps;/]*+(?:\\.|&_brace_noexpansion;)?+)*+">
0029         <!ENTITY opt         "(?:[^&_fragpathseps;=/]*+&_fragpathnosep;)*+">
0030         <!ENTITY assumepath  "/&path;|(?=[&simpleglob;([]|&globrange;)">
0031         <!ENTITY pathpart    "(?:~(?:/&path;|(?=[&wordseps;]|$))|&fragpath;(?:&assumepath;|(?=&fragpathesc;&assumepath;))|\.\.?(?=[&wordseps;]|$))">
0032 
0033         <!-- Path only with / -->
0034         <!ENTITY path_with_sep_text  "[^[&wordseps;'&quot;`\\/]">
0035         <!ENTITY path_with_sep_text2 "[^[()&lt;>'&quot;`\\/]">
0036         <!ENTITY path_with_sep_expr  "\\.|&strings;|&globany;|&globrange;">
0037         <!ENTITY path_with_sep_spe   "(~|\.\.?)($|[/ &tab;&lt;>|&amp;;)])">
0038         <!ENTITY path_with_sep_sub   "\((&path_with_sep_text2;++|&path_with_sep_expr;)*+(\)|(?=/))">
0039         <!ENTITY path_with_sep "/|&path_with_sep_spe;|(&path_with_sep_text;++|&path_with_sep_expr;|&path_with_sep_sub;)*+/">
0040 
0041         <!ENTITY _braceexpansion_spe     " &tab;&lt;>|&amp;;{}\\`'&quot;$">
0042         <!ENTITY _brace_noexpansion      "\{[^&_braceexpansion_spe;,]*+\}">
0043         <!ENTITY _braceexpansion_var     "\$(?:\{[^\[\]&_braceexpansion_spe;]*+(?:\[[*@a-zA-Z0-9]\])\})?">
0044         <!ENTITY _braceexpansion_elems   "\\.|&strings;|&_braceexpansion_var;|&_brace_noexpansion;">
0045         <!ENTITY _braceexpansion_consume "&_braceexpansion_elems;|{(?:[^&_braceexpansion_spe;,]++|&_braceexpansion_elems;)*?}|(?R)?+">
0046         <!ENTITY _braceexpansion "(?:[^&_braceexpansion_spe;,]++|&_braceexpansion_consume;)*?,(?:[^&_braceexpansion_spe;]++|&_braceexpansion_consume;)*?}">
0047         <!ENTITY braceexpansion "{&_braceexpansion;">
0048 
0049         <!ENTITY _bracerangevar "\$([#+^=~]*([_a-zA-Z0-9]+|[*@#])(\[((\$[#+^=~]*)?([-+_a-zA-Z0-9]+|[*@])|$#)\])?|#|'(\\.|[^'\\])')">
0050         <!ENTITY _bracerangeoperand "-?([0-9]+|[a-zA-Z!#$&#37;*+,-./:=?@^_~]|&_bracerangevar;|\\.|'[^'\\]'|&quot;(\\.|[^&quot;\\`])&quot;|`[^`]*`)">
0051         <!ENTITY bracerangeexpansion "{(?=&_bracerangeoperand;\.\.&_bracerangeoperand;(\.\.-?([0-9]+|&_bracerangevar;))?})">
0052 
0053         <!ENTITY nobraceexpansion "(?:{([^&_braceexpansion_spe;/{},]++|(?R))+?})+">
0054         <!ENTITY nogroupend "(?:}+(?:[^&_fragpathseps;]|(?=[}$'&quot;`\\])))">
0055 
0056         <!-- glob with |, ( or spaces is a pattern -->
0057         <!ENTITY _ispattern_ugN "[ug][0123456789]+">
0058         <!ENTITY _ispattern_ugeP "[ugeP](?:&_ispattern_ugeP_0;|&_ispattern_ugeP_1;|&_ispattern_ugeP_2;|&_ispattern_ugeP_3;|&_ispattern_ugeP_4;|(?=\|))">
0059         <!ENTITY _ispattern_ugeP_0    ":(?:[^:'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?::|(?=[|()]))">
0060         <!ENTITY _ispattern_ugeP_1   "\[(?:[^]'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?:\](?=[|()]))">
0061         <!ENTITY _ispattern_ugeP_2    "{(?:[^}'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?:}(?=[|()]))">
0062         <!ENTITY _ispattern_ugeP_3 "&lt;(?:[^>'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?:>|(?=[|()]))">
0063         <!ENTITY _ispattern_ugeP_4  "([^&wordseps;{}'&quot;`\\])(?:(?:(?!\1)[^'`&quot;\\\1|()])*+(?:&_ispattern_q;)?)*(?:\1|(?=[|()]))">
0064         <!ENTITY _ispattern_q "\\.|&strings;">
0065         <!ENTITY _ispattern_check "(?:\)(?:[^ &tab;}&lt;>|&amp;;)]|&nogroupend;)|[ &tab;|(]|$)">
0066         <!ENTITY ispattern "(?:[^ &tab;\\'&quot;|()`ugeP]*+(?:&_ispattern_ugN;|&_ispattern_ugeP;|&_ispattern_q;)?)*&_ispattern_check;">
0067 
0068         <!ENTITY heredocq "(?|&quot;([^&quot;]+)&quot;|'([^']+)'|\\(.[^&wordseps;&substseps;]*))">
0069 
0070         <!ENTITY arithmetic_as_subshell "\(((?:[^`'&quot;()$]++|\$\{[^`'&quot;(){}$]+\}|\$(?=[^{`'&quot;()])|&bq_string;|\((?1)(?:[)]|(?=['&quot;])))++)(?:[)](?=$|[^)])|[&quot;'])">
0071 
0072         <!ENTITY unary_operators  "-[abcdefghknoprstuvwxzLOGNS]&eos;">
0073         <!ENTITY binary_operators "(?:-(?:e[fq]|[nolg]t|[nlg]e)|==?|!=)&eos;">
0074 
0075         <!ENTITY dblbracket_close "\]\](?=($|[ &tab;;|&amp;)]))">
0076 
0077         <!ENTITY int "(?:[0-9]++[_0-9]*+)">
0078         <!ENTITY exp "(?:[eE][-+]?&int;)">
0079 ]>
0080 <language name="Zsh" version="31" kateversion="5.79" section="Scripts" extensions="*.sh;*.zsh;.zshrc;.zprofile;.zlogin;.zlogout;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Jonathan Poelen (jonathan.poelen@gmail.com)" license="MIT">
0081 
0082   <highlighting>
0083     <list name="keywords">
0084       <item>continue</item>
0085       <item>break</item>
0086       <item>case</item>
0087       <item>do</item>
0088       <item>done</item>
0089       <item>elif</item>
0090       <item>else</item>
0091       <item>end</item>
0092       <item>esac</item>
0093       <item>fi</item>
0094       <item>for</item>
0095       <item>foreach</item>
0096       <item>function</item>
0097       <item>if</item>
0098       <item>in</item>
0099       <item>repeat</item>
0100       <item>return</item>
0101       <item>select</item>
0102       <item>then</item>
0103       <item>until</item>
0104       <item>while</item>
0105     </list>
0106 
0107 <list name="builtins"><!-- see man zshbuiltins -->
0108         <item>-</item>
0109         <item>.</item>
0110         <item>:</item>
0111         <item>alias</item>
0112         <item>autoload</item>
0113         <item>bg</item>
0114         <item>bindkey</item>
0115         <item>builtin</item>
0116         <item>bye</item>
0117         <item>cap</item>
0118         <item>cd</item>
0119         <item>chdir</item>
0120         <item>clone</item>
0121         <item>command</item>
0122         <item>comparguments</item>
0123         <item>compcall</item>
0124         <item>compctl</item>
0125         <item>compdescribe</item>
0126         <item>compfiles</item>
0127         <item>compgroups</item>
0128         <item>compquote</item>
0129         <item>comptags</item>
0130         <item>comptry</item>
0131         <item>compvalues</item>
0132         <item>coproc</item>
0133         <item>dirs</item>
0134         <item>disable</item>
0135         <item>disown</item>
0136         <item>echo</item>
0137         <item>echotc</item>
0138         <item>echoti</item>
0139         <item>emulate</item>
0140         <item>enable</item>
0141         <item>eval</item>
0142         <item>exec</item>
0143         <item>exit</item>
0144         <item>false</item>
0145         <item>fc</item>
0146         <item>fg</item>
0147         <item>functions</item>
0148         <item>getcap</item>
0149         <item>hash</item>
0150         <item>history</item>
0151         <item>jobs</item>
0152         <item>kill</item>
0153         <item>limit</item>
0154         <item>log</item>
0155         <item>logout</item>
0156         <item>nocorrect</item>
0157         <item>noglob</item>
0158         <item>popd</item>
0159         <item>print</item>
0160         <item>printf</item>
0161         <item>pushd</item>
0162         <item>pushln</item>
0163         <item>pwd</item>
0164         <item>r</item>
0165         <item>rehash</item>
0166         <item>sched</item>
0167         <item>set</item>
0168         <item>setcap</item>
0169         <item>setopt</item>
0170         <item>shift</item>
0171         <item>source</item>
0172         <item>stat</item>
0173         <item>suspend</item>
0174         <item>test</item>
0175         <item>times</item>
0176         <item>trap</item>
0177         <item>true</item>
0178         <item>ttyctl</item>
0179         <item>type</item>
0180         <item>ulimit</item>
0181         <item>umask</item>
0182         <item>unalias</item>
0183         <item>unfunction</item>
0184         <item>unhash</item>
0185         <item>unlimit</item>
0186         <item>unset</item>
0187         <item>unsetopt</item>
0188         <item>vared</item>
0189         <item>wait</item>
0190         <item>whence</item>
0191         <item>where</item>
0192         <item>which</item>
0193         <item>zcompile</item>
0194         <item>zformat</item>
0195         <item>zftp</item>
0196         <item>zle</item>
0197         <item>zmodload</item>
0198         <item>zparseopts</item>
0199         <item>zprof</item>
0200         <item>zpty</item>
0201         <item>zregexparse</item>
0202         <item>zsocket</item>
0203         <item>zstyle</item>
0204         <item>ztcp</item>
0205     </list>
0206 
0207     <list name="builtins_var">
0208         <item>declare</item>
0209         <item>export</item>
0210         <item>float</item>
0211         <item>getln</item>
0212         <item>getopts</item>
0213         <item>integer</item>
0214         <item>let</item>
0215         <item>local</item>
0216         <item>read</item>
0217         <item>readonly</item>
0218         <item>typeset</item>
0219         <item>unset</item>
0220     </list>
0221 
0222     <list name="unixcommands">
0223       <include>unixcommands##Bash</include>
0224     </list>
0225 
0226     <contexts>
0227       <context attribute="Normal Text" lineEndContext="#stay" name="Start" fallthroughContext="Command">
0228         <DetectSpaces attribute="Normal Text" context="#stay"/>
0229         <DetectChar attribute="Comment" context="Comment" char="#"/>
0230         <!-- start expression in double parentheses -->
0231         <Detect2Chars context="ExprDblParenOrSubShell" char="(" char1="(" lookAhead="1"/>
0232         <!-- start a subshell -->
0233         <DetectChar attribute="Keyword" context="SubShell" char="(" beginRegion="subshell"/>
0234         <!-- start expression in single/double brackets -->
0235         <DetectChar context="MaybeBracketExpression" char="[" lookAhead="1"/>
0236         <!-- start a group command or BraceExpansion with { -->
0237         <DetectChar attribute="Keyword" context="Group" char="{" beginRegion="group"/>
0238 
0239         <!-- handle ` -->
0240         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0241 
0242         <!-- &> redirections -->
0243         <Detect2Chars attribute="Redirection" context="Prefix&amp;>" char="&amp;" char1=">"/>
0244         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="!"/>
0245 
0246         <!-- handle branche conditions -->
0247         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="&amp;"/>
0248         <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
0249 
0250         <!-- handle &, |, ; -->
0251         <AnyChar attribute="Control" context="#stay" String="&amp;|;"/>
0252 
0253         <!-- handle variable assignments -->
0254         <RegExpr attribute="Variable" context="VarAssign" String="&varname;(?=\+?=|\[(?:$|[^]]))|[0-9]+(?=\+?=)"/>
0255         <!-- handle keywords -->
0256         <keyword context="DispatchKeyword" String="keywords" lookAhead="1"/>
0257         <!-- handle commands that have variable names as argument -->
0258         <keyword attribute="Builtin" context="VarName" String="builtins_var" lookAhead="1"/>
0259         <WordDetect attribute="Builtin" context="#stay" String="noglob"/>
0260         <WordDetect attribute="Builtin" context="#stay" String="coproc"/>
0261         <!-- mark function definitions without function keyword -->
0262         <RegExpr attribute="Function" context="#stay" String="&funcname;[ &tab;]*\(\)"/>
0263         <keyword attribute="Builtin" context="CommandArgs" String="builtins"/>
0264         <keyword attribute="Command" context="CommandArgs" String="unixcommands"/>
0265 
0266         <!-- handle redirection -->
0267         <AnyChar context="CommandMaybeRedirection" String="&lt;&gt;0123456789" lookAhead="1"/>
0268 
0269         <DetectChar attribute="Error" context="#stay" char=")"/>
0270         <DetectChar context="MaybeGroupEnd" char="}" lookAhead="1"/>
0271 
0272         <LineContinue attribute="Escape" context="#stay"/>
0273 
0274         <Detect2Chars attribute="Expression" context="#stay" char="!" char1=" "/>
0275       </context>
0276       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeGroupEnd">
0277         <RegExpr context="#pop!Command" String="&nogroupend;" lookAhead="1"/>
0278         <DetectChar attribute="Error" context="#pop" char="}"/>
0279       </context>
0280       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeBracketExpression" fallthroughContext="#pop!Command">
0281         <!-- start expression in double brackets -->
0282         <RegExpr attribute="Keyword" context="#pop!ExprDblBracket" String="\[\[(?=$|[ &tab;(])" beginRegion="expression"/>
0283         <!-- start expression in single brackets -->
0284         <RegExpr attribute="Builtin" context="#pop!ExprBracket" String="\[&eos;" beginRegion="expression"/>
0285       </context>
0286       <context attribute="Normal Text" lineEndContext="#pop" name="CommandMaybeRedirection" fallthroughContext="#pop!Command">
0287         <IncludeRules context="FindRedirection"/>
0288       </context>
0289       <context attribute="Normal Text" lineEndContext="#pop" name="Return" fallthroughContext="#pop">
0290         <DetectSpaces attribute="Normal Text" context="#stay"/>
0291         <Int attribute="Number" context="#stay"/>
0292       </context>
0293       <!-- Comment consumes shell comments till EOL -->
0294       <context attribute="Comment" lineEndContext="#pop" name="Comment">
0295         <DetectSpaces attribute="Comment"/>
0296         <IncludeRules context="##Comments"/>
0297         <DetectIdentifier attribute="Comment" context="#stay"/>
0298       </context>
0299 
0300       <!-- Group is called after a { is encountered -->
0301       <context attribute="Normal Text" lineEndContext="#stay" name="Group" fallthroughContext="Command">
0302         <DetectChar attribute="Keyword" context="#pop!GroupEnd" char="}" endRegion="group"/>
0303         <IncludeRules context="Start"/>
0304       </context>
0305       <context attribute="Normal Text" lineEndContext="#pop" name="GroupEnd" fallthroughContext="#pop!CommandArgs">
0306         <DetectSpaces attribute="Normal Text" context="#stay"/>
0307         <WordDetect attribute="Control Flow" context="#pop" String="always"/>
0308       </context>
0309 
0310       <context attribute="OtherCommand" lineEndContext="#pop" name="Command">
0311         <DetectSpaces attribute="Normal Text" context="#pop!CommandArgs"/>
0312         <DetectIdentifier attribute="OtherCommand" context="#stay"/>
0313         <DetectChar context="CommandVariables" char="$" lookAhead="1"/>
0314         <IncludeRules context="FindStrings"/>
0315         <Detect2Chars attribute="Control" context="#pop" char="&amp;" char1="&amp;"/>
0316         <Detect2Chars attribute="Control" context="#pop" char="|" char1="|"/>
0317         <DetectChar attribute="Control" context="#pop" char="|"/>
0318         <AnyChar context="#pop" String=";)`" lookAhead="1"/>
0319         <AnyChar context="#pop!CommandArgs" String="&amp;&lt;>" lookAhead="1"/>
0320         <!-- start expression in double parentheses -->
0321         <Detect2Chars attribute="Error" context="#pop!ExprDblParen" char="(" char1="(" beginRegion="expression"/>
0322         <!-- start a subshell -->
0323         <DetectChar attribute="Error" context="#pop!SubShell" char="(" beginRegion="subshell"/>
0324         <DetectChar context="CommandAssumeEscape" char="\" lookAhead="1"/>
0325         <DetectChar context="CommandMaybeBraceExpansion" char="{" lookAhead="1"/>
0326         <DetectChar context="CommandMaybeGroupEnd" char="}" lookAhead="1"/>
0327       </context>
0328       <context attribute="Command" lineEndContext="#pop" name="CommandVariables">
0329         <IncludeRules context="DispatchVariables"/>
0330         <DetectChar attribute="OtherCommand" context="#pop" char="$"/>
0331       </context>
0332       <context attribute="OtherCommand" lineEndContext="#pop" name="CommandAssumeEscape">
0333         <LineContinue attribute="Escape" context="#pop"/>
0334         <RegExpr attribute="OtherCommand" context="#pop" String="\\."/>
0335       </context>
0336       <context attribute="OtherCommand" lineEndContext="#pop" name="CommandMaybeBraceExpansion">
0337         <IncludeRules context="DispatchBraceExpansion"/>
0338         <DetectChar attribute="OtherCommand" context="#pop" char="{"/>
0339       </context>
0340       <context attribute="Normal Text" lineEndContext="#pop" name="CommandMaybeGroupEnd">
0341         <RegExpr attribute="OtherCommand" context="#pop" String="&nogroupend;+"/>
0342         <DetectChar context="#pop#pop" char="}" lookAhead="1"/>
0343       </context>
0344 
0345       <context attribute="Variable" lineEndContext="#pop" name="DispatchVariables">
0346         <IncludeRules context="DispatchSubstVariables"/>
0347         <IncludeRules context="DispatchStringVariables"/>
0348         <IncludeRules context="DispatchVarNameVariables"/>
0349       </context>
0350       <context attribute="Variable" lineEndContext="#pop" name="DispatchSubstVariables">
0351         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarBraceStart" char="$" char1="{"/>
0352         <StringDetect context="#pop!ExprDblParenSubstOrSubstCommand" String="$((" lookAhead="1"/>
0353         <Detect2Chars attribute="Parameter Expansion" context="#pop!SubstCommand" char="$" char1="(" beginRegion="subshell"/>
0354       </context>
0355       <context attribute="Variable" lineEndContext="#pop" name="DispatchStringVariables">
0356         <Detect2Chars attribute="String SingleQ" context="#pop!StringEsc" char="$" char1="'"/>
0357         <Detect2Chars attribute="String Transl." context="#pop!StringDQ" char="$" char1="&quot;"/>
0358       </context>
0359       <context attribute="Variable" lineEndContext="#pop" name="DispatchVarNameVariables">
0360         <RegExpr attribute="Dollar Prefix" context="#pop!VarNamePrefixedWithDollar" String="\$(?=&varname;|[0-9]+|[-*@?$!#~=^+])"/>
0361       </context>
0362       <context attribute="Variable" lineEndContext="#pop" name="VarNamePrefixedWithDollar">
0363         <DetectIdentifier attribute="Variable" context="#pop!AfterVarName"/>
0364         <Int attribute="Variable" context="#pop!AfterVarName" additionalDeliminator="$"/>
0365         <AnyChar attribute="Variable" context="#pop!AfterVarName" String="-*@?$!"/>
0366         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameSubstLen" char="#"/>
0367         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameParam+" char="+"/>
0368         <AnyChar attribute="Parameter Expansion Operator" context="#pop!VarNameParam" String="~=^"/>
0369       </context>
0370       <context attribute="Variable" lineEndContext="#pop" name="VarNameSubstLen" fallthroughContext="#pop!AfterVarName">
0371         <DetectIdentifier attribute="Variable" context="#pop!AfterVarName"/>
0372         <AnyChar attribute="Variable" context="#pop!AfterVarName" String="-*@?$!"/>
0373         <Int attribute="Variable" context="#pop!AfterVarName" additionalDeliminator="#~=^+{}[]:-/$"/>
0374       </context>
0375       <context attribute="Variable" lineEndContext="#pop" name="VarNameParam" fallthroughContext="#pop!AfterVarName">
0376         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameSubstLen" char="#"/>
0377         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameParam+" char="+"/>
0378         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="^=~"/>
0379         <IncludeRules context="VarNameSubstLen"/>
0380       </context>
0381       <context attribute="Variable" lineEndContext="#pop" name="VarNameParam+" fallthroughContext="#pop">
0382         <IncludeRules context="VarNameSubstLen"/>
0383       </context>
0384 
0385       <!-- called as soon as $xxx is encoutered -->
0386       <context attribute="Normal Text" lineEndContext="#pop" name="AfterVarName" fallthroughContext="#pop">
0387         <DetectChar context="VarNameDispatchModifiers" char=":" lookAhead="1"/>
0388         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0389       </context>
0390       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameDispatchModifiers" fallthroughContext="#pop#pop">
0391         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="a"/>
0392         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="A"/>
0393         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="c"/>
0394         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="e"/>
0395         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarNameModifier_h" char=":" char1="h"/>
0396         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="l"/>
0397         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="p"/>
0398         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="P"/>
0399         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="q"/>
0400         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="Q"/>
0401         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="r"/>
0402         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarNameModifier_s" char=":" char1="s"/>
0403         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarNameModifier_h" char=":" char1="t"/>
0404         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="u"/>
0405         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="x"/>
0406         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="&amp;"/>
0407         <StringDetect attribute="Parameter Expansion" context="#pop!VarNameModifier_s" String=":gs"/>
0408       </context>
0409       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameModifier_h" fallthroughContext="#pop">
0410         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
0411       </context>
0412       <context attribute="Parameter Expansion Operator" lineEndContext="#pop#pop" name="VarNameModifier_s" fallthroughContext="#pop#pop">
0413         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameModifier_s_Str" char="/"/>
0414       </context>
0415       <context attribute="String SingleQ" lineEndContext="#pop#pop" name="VarNameModifier_s_Str">
0416         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameModifier_s_Rep" char="/"/>
0417         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0418         <DetectChar attribute="String DoubleQ" context="#pop" char="&quot;"/>
0419         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
0420       </context>
0421       <context attribute="String SingleQ" lineEndContext="#pop#pop" name="VarNameModifier_s_Rep">
0422         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0423         <IncludeRules context="FindWord"/>
0424         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="/"/>
0425         <AnyChar context="#pop#pop" String=" &tab;&lt;>|&amp;;()" lookAhead="1"/>
0426         <DetectIdentifier attribute="String SingleQ"/>
0427       </context>
0428 
0429       <context attribute="Normal Text" lineEndContext="#stay" name="CommandBackq" fallthroughContext="Command">
0430         <DetectChar attribute="Backquote" context="#pop!CommandArgs" char="`"/>
0431         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
0432         <IncludeRules context="Start"/>
0433       </context>
0434       <!-- CommentBackq consumes shell comments till EOL or a backquote -->
0435       <context attribute="Comment" lineEndContext="#pop" name="CommentBackq">
0436         <DetectChar context="#pop" char="`" lookAhead="1"/>
0437         <IncludeRules context="Comment"/>
0438       </context>
0439 
0440       <!-- CommandArgs matches the items after a command -->
0441       <context attribute="Normal Text" lineEndContext="#pop" name="CommandArgs" fallthroughContext="CommandArg">
0442         <DetectSpaces attribute="Normal Text" context="#stay"/>
0443 
0444         <!-- &> redirections -->
0445         <Detect2Chars attribute="Redirection" context="Prefix&amp;>" char="&amp;" char1=">"/>
0446 
0447         <!-- handle &, |, ;, ` -->
0448         <AnyChar context="#pop" String="&amp;|;`" lookAhead="1"/>
0449 
0450         <!-- handle process subst -->
0451         <Detect2Chars attribute="Redirection" context="ProcessSubst" char="=" char1="("/>
0452         <!-- handle redirection -->
0453         <AnyChar context="CommandArgMaybeRedirection" String="&gt;&lt;0123456789" lookAhead="1"/>
0454 
0455         <DetectChar context="#pop" char=")" lookAhead="1"/>
0456       </context>
0457       <context attribute="Normal Text" lineEndContext="#pop#pop" name="CommandArg" fallthroughContext="#pop!NormalOption">
0458         <!-- In command arguments, do not allow comments after escaped characters.
0459              This avoids highlighting comments within paths or other text. Ex: pathtext\ #no\ comment -->
0460         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0461         <Detect2Chars attribute="Option" context="#pop!LongOption" char="-" char1="-"/>
0462         <DetectChar attribute="Option" context="#pop!ShortOption" char="-"/>
0463         <DetectChar attribute="Keyword" context="#pop!NormalOption" char="="/>
0464       </context>
0465       <context attribute="Normal Text" lineEndContext="#pop" name="CommandArgMaybeRedirection" fallthroughContext="#pop!NormalOption">
0466         <IncludeRules context="FindRedirection"/>
0467       </context>
0468 
0469       <context attribute="Option" lineEndContext="#pop" name="ShortOption" fallthroughContext="#pop">
0470         <DetectChar attribute="Path" context="PathThenPop" char="/"/>
0471         <IncludeRules context="LongOption"/>
0472       </context>
0473       <context attribute="Option" lineEndContext="#pop" name="LongOption" fallthroughContext="#pop">
0474         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0475         <DetectChar attribute="Operator" context="#pop!NormalOption" char="="/>
0476         <IncludeRules context="FindWord"/>
0477         <IncludeRules context="FindSingleGlob"/>
0478         <IncludeRules context="FindGlobAny"/>
0479         <AnyChar context="#pop!NormalOption" String="({}&lt;" lookAhead="1"/>
0480         <RegExpr attribute="Option" context="#stay" String="&opt;"/>
0481       </context>
0482       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOption" fallthroughContext="#pop">
0483         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0484         <IncludeRules context="FindWord"/>
0485         <DetectChar attribute="Glob" context="PathThenPop" char="[" lookAhead="1"/>
0486         <DetectChar context="ExprGlobParenThenPath" char="(" lookAhead="1"/>
0487         <IncludeRules context="FindPathThenPop"/>
0488         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0489         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
0490         <IncludeRules context="FindNormalTextOption"/>
0491         <DetectChar context="MaybeGlobRangeOrPop" char="&lt;" lookAhead="1"/>
0492       </context>
0493       <context attribute="Normal Text" lineEndContext="#pop#pop" name="NormalOptionRecBrace">
0494         <AnyChar context="#pop#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0495         <IncludeRules context="FindWord"/>
0496         <IncludeRules context="FindSingleGlob"/>
0497         <IncludeRules context="FindGlobAny"/>
0498         <DetectChar context="ExprGlobParen" char="(" lookAhead="1"/>
0499         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0500         <DetectChar attribute="Normal Text" context="#pop" char="}"/>
0501         <DetectChar context="MaybeGlobRangeOrPop" char="&lt;" lookAhead="1"/>
0502         <DetectIdentifier/>
0503       </context>
0504       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOptionMaybeGroupEnd">
0505         <IncludeRules context="FindNoGroupEndThenPop"/>
0506         <DetectChar context="#pop#pop#pop" char="}" lookAhead="1"/>
0507       </context>
0508       <context attribute="Normal Text" lineEndContext="#pop" name="FindNoGroupEndThenPop">
0509         <RegExpr context="#pop" String="&nogroupend;"/>
0510       </context>
0511       <context attribute="Normal Text" lineEndContext="#stay" name="FindNormalTextOption">
0512         <RegExpr attribute="Normal Text" context="#stay" String="([^[&wordseps;&substseps;]+|&nogroupend;)+"/>
0513       </context>
0514       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOptionMaybeBraceExpansion">
0515         <IncludeRules context="DispatchBraceExpansion"/>
0516         <DetectChar attribute="Normal Text" context="#pop!NormalOptionRecBrace" char="{"/>
0517       </context>
0518 
0519       <context attribute="Normal Text" lineEndContext="#pop" name="AssumeEscape">
0520         <LineContinue attribute="Escape" context="#pop"/>
0521         <RegExpr attribute="Escape" context="#pop" String="\\."/>
0522       </context>
0523 
0524 <!-- ====== The following rulessets are meant to be included ======== -->
0525 
0526       <!-- FindRedirection consumes shell redirection -->
0527       <context attribute="Normal Text" lineEndContext="#pop" name="FindRedirection">
0528         <RegExpr attribute="File Descriptor" context="#pop!AssumeRedirection" String="[0-9]++(?=[&lt;>])"/>
0529         <IncludeRules context="AssumeRedirection"/>
0530       </context>
0531 
0532       <!-- DispatchBraceExpansion consumes brace expansions -->
0533       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchBraceExpansion">
0534         <RegExpr context="#pop!BraceExpansion" String="&braceexpansion;" lookAhead="1"/>
0535         <IncludeRules context="IncBraceExpansion"/>
0536       </context>
0537       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchPathBraceExpansion">
0538         <RegExpr context="#pop!PathBraceExpansion" String="&braceexpansion;" lookAhead="1"/>
0539         <IncludeRules context="IncBraceExpansion"/>
0540       </context>
0541       <context attribute="Normal Text" lineEndContext="#pop" name="IncBraceExpansion">
0542         <RegExpr attribute="Escape" context="#pop!SequenceExpression" String="&bracerangeexpansion;"/>
0543         <RegExpr context="#pop" String="&nobraceexpansion;"/>
0544       </context>
0545 
0546       <!-- FindPathThenPop consumes path -->
0547       <context attribute="Normal Text" lineEndContext="#pop" name="FindPathThenPop">
0548         <AnyChar attribute="Glob" context="PathThenPop" String="?*#^"/>
0549         <RegExpr attribute="Path" context="PathThenPop" String="&pathpart;"/>
0550         <DetectChar attribute="Glob" context="PathThenPop" char="~"/>
0551       </context>
0552       <context attribute="Path" lineEndContext="#pop#pop" name="IncPath">
0553         <IncludeRules context="FindWord"/>
0554         <IncludeRules context="FindSingleGlob"/>
0555         <IncludeRules context="FindGlobAny"/>
0556         <DetectChar context="ExprGlobParen" char="(" lookAhead="1"/>
0557         <RegExpr attribute="Path" context="#stay" String="&path;"/>
0558         <DetectChar context="MaybeGlobRangeOrPop" char="&lt;" lookAhead="1"/>
0559         <DetectChar context="PathMaybeBraceExpansion" char="{" lookAhead="1"/>
0560       </context>
0561       <context attribute="Path" lineEndContext="#pop#pop" name="PathThenPop">
0562         <AnyChar context="#pop#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0563         <IncludeRules context="IncPath"/>
0564         <DetectChar context="PathMaybeGroupEnd" char="}" lookAhead="1"/>
0565         <DetectIdentifier attribute="Path"/>
0566       </context>
0567       <context attribute="Path" lineEndContext="#pop" name="PathRecBrace">
0568         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0569         <IncludeRules context="IncPath"/>
0570         <DetectChar attribute="Path" context="#pop" char="}"/>
0571         <DetectIdentifier attribute="Path"/>
0572       </context>
0573       <context attribute="Glob" lineEndContext="#stay" name="MaybeGlobRangeOrPop" fallthroughContext="#pop#pop">
0574         <IncludeRules context="FindGlobRangeThenPop"/>
0575       </context>
0576       <context attribute="Path" lineEndContext="#pop" name="PathMaybeBraceExpansion">
0577         <IncludeRules context="DispatchPathBraceExpansion"/>
0578         <DetectChar attribute="Path" context="#pop!PathRecBrace" char="{"/>
0579       </context>
0580       <context attribute="Path" lineEndContext="#pop" name="PathMaybeGroupEnd">
0581         <IncludeRules context="FindNoGroupEndThenPop"/>
0582         <DetectChar context="#pop#pop#pop" char="}" lookAhead="1"/>
0583       </context>
0584       <context attribute="Glob" lineEndContext="#stay" name="FindGlobRangeThenPop">
0585         <RegExpr attribute="Glob" context="#pop!InGlobRange" String="&lt;(?=[0-9]*-[0-9]*>)"/>
0586       </context>
0587       <context attribute="Number" lineEndContext="#stay" name="InGlobRange">
0588         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
0589         <DetectChar attribute="Glob" context="#stay" char="-"/>
0590         <DetectChar attribute="Glob" context="#pop" char=">"/>
0591       </context>
0592 
0593       <!-- FindPathThenPopInAlternateValue consumes path in ${xx:here}-->
0594       <context attribute="Normal Text" lineEndContext="#pop" name="FindPathThenPopInAlternateValue">
0595         <AnyChar attribute="Glob" context="PathThenPopInAlternateValue" String="&simpleglob;|"/>
0596         <Detect2Chars context="PathThenPopInAlternateValue" char="(" char1="#" lookAhead="1"/>
0597         <AnyChar context="PathThenPopInAlternateValue" String="[(" lookAhead="1"/>
0598         <RegExpr attribute="Path" context="PathThenPopInAlternateValue" String="&pathpart;"/>
0599       </context>
0600       <context attribute="Path" lineEndContext="#pop" name="PathThenPopInAlternateValue">
0601         <AnyChar context="#pop" String="&wordseps_or_extglog;}" lookAhead="1"/>
0602         <IncludeRules context="IncPath"/>
0603         <DetectIdentifier/>
0604       </context>
0605 
0606       <context attribute="Glob" lineEndContext="#stay" name="FindGlobAny">
0607         <DetectChar attribute="Glob" context="GlobAnyFlag" char="["/>
0608       </context>
0609       <context attribute="String SingleQ" lineEndContext="#pop" name="GlobAnyFlag" fallthroughContext="#pop!GlobAny">
0610         <DetectChar attribute="Glob Flag" context="#pop!GlobAny" char="^"/>
0611       </context>
0612       <context attribute="String SingleQ" lineEndContext="#pop" name="GlobAny">
0613         <DetectIdentifier attribute="String SingleQ"/>
0614         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0615         <DetectChar attribute="Glob Flag" context="#stay" char="-"/>
0616         <IncludeRules context="FindStrings"/>
0617         <DetectChar attribute="Glob" context="#pop" char="]"/>
0618         <Detect2Chars attribute="Glob" context="GlobClass" char="[" char1=":"/>
0619       </context>
0620       <context attribute="Glob" lineEndContext="#pop#pop" name="GlobClass">
0621         <DetectIdentifier attribute="Pattern"/>
0622         <Detect2Chars attribute="Glob" context="#pop" char=":" char1="]"/>
0623         <DetectChar attribute="Error" context="#pop" char="]"/>
0624       </context>
0625 
0626       <context attribute="Pattern" lineEndContext="#stay" name="FindSingleGlob">
0627         <AnyChar attribute="Glob" context="#stay" String="&simpleglob;"/>
0628       </context>
0629 
0630       <context attribute="Pattern" lineEndContext="#stay" name="FindGlobPattern">
0631         <AnyChar attribute="Glob" context="#stay" String="&simpleglob;|"/>
0632         <IncludeRules context="FindGlobAny"/>
0633         <IncludeRules context="FindGroupPattern"/>
0634       </context>
0635 
0636       <context attribute="Pattern" lineEndContext="#stay" name="FindPattern">
0637         <IncludeRules context="FindGlobPattern"/>
0638         <DetectChar context="GlobRangeOrError" char="&lt;" lookAhead="1"/>
0639       </context>
0640       <context attribute="Glob" lineEndContext="#stay" name="GlobRangeOrError">
0641         <IncludeRules context="FindGlobRangeThenPop"/>
0642         <DetectChar attribute="Error" context="#pop" char="&lt;"/>
0643       </context>
0644 
0645       <context attribute="Pattern" lineEndContext="#stay" name="FindSubPattern">
0646         <IncludeRules context="FindGlobPattern"/>
0647         <DetectChar context="GlobRangeOrPattern" char="&lt;" lookAhead="1"/>
0648       </context>
0649       <context attribute="Pattern" lineEndContext="#stay" name="GlobRangeOrPattern">
0650         <IncludeRules context="FindGlobRangeThenPop"/>
0651         <DetectChar attribute="Pattern" context="#pop" char="&lt;"/>
0652       </context>
0653 
0654       <context attribute="Pattern" lineEndContext="#stay" name="FindStringDQPattern">
0655         <IncludeRules context="FindGlobPattern"/>
0656         <DetectChar context="GlobRangeOrStringDQ" char="&lt;" lookAhead="1"/>
0657       </context>
0658       <context attribute="String DoubleQ" lineEndContext="#stay" name="GlobRangeOrStringDQ">
0659         <IncludeRules context="FindGlobRangeThenPop"/>
0660         <DetectChar attribute="String DoubleQ" context="#pop" char="&lt;"/>
0661       </context>
0662 
0663       <context attribute="Glob Flag" lineEndContext="#stay" name="FindGroupPattern">
0664         <Detect2Chars attribute="Glob Flag" context="GlobPatFlag" char="(" char1="#"/>
0665         <DetectChar attribute="Glob" context="ExtGlobPattern" char="("/>
0666       </context>
0667       <context attribute="Pattern" lineEndContext="#stay" name="ExtGlobPattern">
0668         <DetectChar attribute="Glob" context="#pop" char=")"/>
0669         <IncludeRules context="FindWord"/>
0670         <IncludeRules context="FindSubPattern"/>
0671         <DetectIdentifier attribute="Pattern"/>
0672       </context>
0673       <context attribute="Pattern" lineEndContext="#stay" name="ExtGlobPatternThenPath">
0674         <DetectChar attribute="Glob" context="#pop!PathThenPop" char=")"/>
0675         <IncludeRules context="FindWord"/>
0676         <IncludeRules context="FindSubPattern"/>
0677         <DetectIdentifier attribute="Pattern"/>
0678       </context>
0679 
0680       <context attribute="Normal Text" lineEndContext="#pop" name="VarAssign" fallthroughContext="#pop">
0681         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0682         <DetectChar attribute="Operator" context="#pop!Assign" char="="/>
0683         <Detect2Chars attribute="Operator" context="#pop!Assign" char="+" char1="="/>
0684       </context>
0685 
0686       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchKeyword">
0687         <!-- match do and if blocks -->
0688         <Detect2Chars attribute="Control Flow" context="#pop!NotCond" char="i" char1="f" beginRegion="if"/>
0689         <Detect2Chars attribute="Control Flow" context="#pop" char="f" char1="i" endRegion="if"/>
0690         <StringDetect attribute="Control Flow" context="#pop" String="done" endRegion="do"/>
0691         <Detect2Chars attribute="Control Flow" context="#pop" char="d" char1="o" beginRegion="do"/>
0692         <!-- handle while/until as a special case -->
0693         <StringDetect attribute="Control Flow" context="#pop!NotCond" String="while"/>
0694         <StringDetect attribute="Control Flow" context="#pop!NotCond" String="until"/>
0695         <!-- handle for as a special case -->
0696         <StringDetect attribute="Control Flow" context="#pop!Foreach" String="foreach"/>
0697         <StringDetect attribute="Control Flow" context="#pop!For" String="for"/>
0698         <!-- handle select as a special case -->
0699         <StringDetect attribute="Control Flow" context="#pop!Select" String="select"/>
0700         <StringDetect attribute="Control Flow" context="#pop!Repeat" String="repeat"/>
0701         <!-- handle case as a special case -->
0702         <StringDetect attribute="Control Flow" context="#pop!Case" String="case" beginRegion="case"/>
0703         <!-- handle functions with function keyword before keywords -->
0704         <StringDetect attribute="Keyword" context="#pop!FunctionDef" String="function"/>
0705         <StringDetect attribute="Control Flow" context="#pop!Return" String="return"/>
0706         <!-- not a keyword in this context -->
0707         <Detect2Chars attribute="Error" context="#pop" char="i" char1="n"/>
0708         <StringDetect attribute="Error" context="#pop" String="esac"/>
0709         <!-- handle keywords -->
0710         <DetectIdentifier attribute="Control Flow" context="#pop"/>
0711       </context>
0712 
0713       <!-- if ! ... and while ! ... -->
0714       <context attribute="Normal Text" lineEndContext="#pop" name="NotCond" fallthroughContext="#pop">
0715         <DetectSpaces attribute="Normal Text" context="#pop!NotCond2"/>
0716       </context>
0717       <context attribute="Normal Text" lineEndContext="#pop" name="NotCond2" fallthroughContext="#pop">
0718         <Detect2Chars attribute="Expression" context="#pop" char="!" char1="&tab;"/>
0719         <Detect2Chars attribute="Expression" context="#pop" char="!" char1=" "/>
0720         <LineContinue attribute="Expression" context="#pop" char="!"/>
0721       </context>
0722 
0723       <context attribute="Normal Text" lineEndContext="#pop" name="Foreach" fallthroughContext="#pop">
0724         <LineContinue attribute="Escape" context="#stay"/>
0725         <DetectSpaces attribute="Normal Text" context="#stay"/>
0726         <DetectIdentifier attribute="Normal Text" context="#stay"/>
0727         <DetectChar attribute="Keyword" context="#pop!ForeachWord" char="("/>
0728       </context>
0729       <context attribute="Normal Text" lineEndContext="#stay" name="ForeachWord" fallthroughContext="NormalOption">
0730         <DetectSpaces attribute="Normal Text" context="#stay"/>
0731         <DetectChar attribute="Control" context="#stay" char=";"/>
0732         <DetectChar attribute="Keyword" context="#pop" char=")"/>
0733         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0734         <AnyChar attribute="Control" context="#stay" String="&symbolseps;"/>
0735       </context>
0736 
0737       <context attribute="Normal Text" lineEndContext="#pop" name="For" fallthroughContext="#pop">
0738         <LineContinue attribute="Escape" context="#stay"/>
0739         <DetectSpaces attribute="Normal Text" context="#stay"/>
0740         <WordDetect attribute="Keyword" context="#pop!CommandArgs" String="in"/>
0741         <DetectIdentifier attribute="Normal Text" context="#stay"/>
0742         <Detect2Chars attribute="Keyword" context="#pop!ForArithmeticExpr" char="(" char1="("/>
0743         <DetectChar attribute="Keyword" context="#pop!ForeachWord" char="("/>
0744       </context>
0745       <context attribute="Normal Text" lineEndContext="#pop" name="ForArithmeticExpr">
0746         <DetectSpaces attribute="Normal Text" context="#stay"/>
0747         <DetectChar attribute="Control" context="#stay" char=";"/>
0748         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")"/>
0749         <IncludeRules context="FindExprDblParen"/>
0750       </context>
0751 
0752       <context attribute="Normal Text" lineEndContext="#pop" name="Select" fallthroughContext="#pop">
0753         <LineContinue attribute="Escape" context="#stay"/>
0754         <DetectSpaces attribute="Normal Text" context="#stay"/>
0755         <DetectIdentifier attribute="Normal Text" context="#pop!SelectIn"/>
0756       </context>
0757       <context attribute="Normal Text" lineEndContext="#pop" name="SelectIn" fallthroughContext="#pop">
0758         <LineContinue attribute="Escape" context="#stay"/>
0759         <DetectSpaces attribute="Normal Text" context="#stay"/>
0760         <WordDetect attribute="Keyword" context="#pop!CommandArgs" String="in"/>
0761       </context>
0762 
0763       <context attribute="Normal Text" lineEndContext="#pop" name="Repeat" fallthroughContext="#pop!RepeatArithmeticExpr">
0764         <LineContinue attribute="Escape" context="#stay"/>
0765         <DetectSpaces attribute="Normal Text" context="#stay"/>
0766       </context>
0767       <context attribute="Normal Text" lineEndContext="#pop" name="RepeatArithmeticExpr">
0768         <DetectSpaces attribute="Normal Text" context="#pop"/>
0769         <DetectChar attribute="Control" context="#pop" char=";"/>
0770         <IncludeRules context="FindExprDblParen"/>
0771       </context>
0772 
0773       <!-- &> and &>> redirection -->
0774       <context attribute="Normal Text" lineEndContext="#pop" name="Prefix&amp;>" fallthroughContext="#pop!FdRedirection">
0775         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="|"/>
0776         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="!"/>
0777         <AnyChar attribute="Redirection" context="#pop!WordRedirection" String=">|!"/>
0778       </context>
0779 
0780       <context attribute="Normal Text" lineEndContext="#pop" name="AssumeRedirection">
0781         <!-- handle output redirection -->
0782         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>|"/>
0783         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>!"/>
0784         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>&amp;|"/>
0785         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>&amp;!"/>
0786         <StringDetect attribute="Redirection" context="#pop!ProcessSubst" String=">>("/>
0787         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1=">"/>
0788         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="|"/>
0789         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="!"/>
0790         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">&amp;|"/>
0791         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">&amp;!"/>
0792         <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char=">" char1="&amp;"/>
0793         <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char=">" char1="("/>
0794         <DetectChar attribute="Redirection" context="#pop!WordRedirection" char=">"/>
0795         <!-- handle input redirection -->
0796         <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char="&lt;" char1="("/>
0797         <StringDetect attribute="Redirection" context="#pop!ProcessSubst" String="&lt;&lt;("/>
0798         <StringDetect attribute="Redirection" context="#pop!StringRedirection" String="&lt;&lt;&lt;"/>
0799         <!-- handle here document -->
0800         <Detect2Chars context="#pop!HereDoc" char="&lt;" char1="&lt;" lookAhead="1"/>
0801         <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char="&lt;" char1="&amp;"/>
0802         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char="&lt;" char1=">"/>
0803         <IncludeRules context="FindGlobRangeThenPop"/>
0804         <DetectChar attribute="Redirection" context="#pop!WordRedirection" char="&lt;"/>
0805       </context>
0806       <context attribute="Normal Text" lineEndContext="#pop" name="FdRedirection" fallthroughContext="#pop!FdRedirection2">
0807         <DetectSpaces attribute="Normal Text" context="#pop!FdRedirection2"/>
0808       </context>
0809       <context attribute="Normal Text" lineEndContext="#pop" name="FdRedirection2" fallthroughContext="#pop!WordRedirection2">
0810         <RegExpr attribute="File Descriptor" context="#pop!CloseFile" String="[0-9]+(?=-?&eoexpr;)"/>
0811       </context>
0812       <context attribute="Normal Text" lineEndContext="#pop" name="WordRedirection" fallthroughContext="#pop!WordRedirection2">
0813         <DetectSpaces attribute="Normal Text" context="#pop!WordRedirection2"/>
0814       </context>
0815       <context attribute="Normal Text" lineEndContext="#pop" name="WordRedirection2" fallthroughContext="#pop">
0816         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
0817         <IncludeRules context="FindWord"/>
0818         <RegExpr attribute="Path" context="PathThenPop" String="&path;"/>
0819       </context>
0820       <context attribute="Normal Text" lineEndContext="#pop" name="StringRedirection" fallthroughContext="#pop!StringRedirection2">
0821         <DetectSpaces attribute="Normal Text" context="#pop!StringRedirection2"/>
0822       </context>
0823       <context attribute="Normal Text" lineEndContext="#pop" name="StringRedirection2">
0824         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
0825         <IncludeRules context="FindWord"/>
0826         <DetectIdentifier attribute="Normal Text"/>
0827       </context>
0828       <context attribute="Normal Text" lineEndContext="#pop" name="CloseFile" fallthroughContext="#pop">
0829         <DetectChar attribute="Keyword" context="#pop" char="-"/>
0830       </context>
0831 
0832       <!-- HereDoc consumes Here-documents. It is called at the beginning of the "<<" construct. -->
0833       <context attribute="Normal Text" lineEndContext="#stay" name="HereDoc">
0834         <RegExpr attribute="Redirection" context="HereDocIQ"  String="&lt;&lt;-[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
0835         <RegExpr attribute="Redirection" context="HereDocINQ" String="&lt;&lt;-[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
0836         <RegExpr attribute="Redirection" context="HereDocQ"   String="&lt;&lt;[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
0837         <RegExpr attribute="Redirection" context="HereDocNQ"  String="&lt;&lt;[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
0838 
0839         <RegExpr context="HereDocIQCmd"  String="(&lt;&lt;-[ &tab;]*&heredocq;)" lookAhead="1"/>
0840         <RegExpr context="HereDocINQCmd" String="(&lt;&lt;-[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
0841         <RegExpr context="HereDocQCmd"   String="(&lt;&lt;[ &tab;]*&heredocq;)" lookAhead="1"/>
0842         <RegExpr context="HereDocNQCmd"  String="(&lt;&lt;[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
0843 
0844         <Detect2Chars attribute="Redirection" context="#pop"  char="&lt;" char1="&lt;"/><!-- always met -->
0845       </context>
0846 
0847       <context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder" fallthroughContext="Command">
0848         <IncludeRules context="Start"/>
0849       </context>
0850 
0851       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocQ" dynamic="1" fallthroughContext="HereDocText">
0852         <RegExpr attribute="Redirection" context="#pop#pop" String="^%1$" dynamic="1" column="0"/>
0853       </context>
0854 
0855       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocNQ" dynamic="1" fallthroughContext="HereDocSubstitutions">
0856         <RegExpr attribute="Redirection" context="#pop#pop" String="^%1$" dynamic="1" column="0"/>
0857       </context>
0858 
0859       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocIQ" dynamic="1" fallthroughContext="HereDocText">
0860         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%1$" dynamic="1" column="0"/>
0861       </context>
0862 
0863       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocINQ" dynamic="1" fallthroughContext="HereDocSubstitutions">
0864         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%1$" dynamic="1" column="0"/>
0865       </context>
0866 
0867       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocQCmd" dynamic="1" fallthroughContext="HereDocText">
0868         <StringDetect attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="1"/>
0869         <RegExpr attribute="Redirection" context="#pop#pop" String="^%2$" dynamic="1" column="0"/>
0870       </context>
0871 
0872       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocNQCmd" dynamic="1" fallthroughContext="HereDocSubstitutions">
0873         <StringDetect attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="1"/>
0874         <RegExpr attribute="Redirection" context="#pop#pop" String="^%2$" dynamic="1" column="0"/>
0875       </context>
0876 
0877       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocIQCmd" dynamic="1" fallthroughContext="HereDocText">
0878         <StringDetect attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="1"/>
0879         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2$" dynamic="1" column="0"/>
0880       </context>
0881 
0882       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocINQCmd" dynamic="1" fallthroughContext="HereDocSubstitutions">
0883         <StringDetect attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="1"/>
0884         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2$" dynamic="1" column="0"/>
0885       </context>
0886 
0887       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocText">
0888       </context>
0889 
0890       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocSubstitutions">
0891         <DetectSpaces attribute="Here Doc"/>
0892         <DetectIdentifier attribute="Here Doc"/>
0893         <DetectChar context="HereDocVariables" char="$" lookAhead="1"/>
0894         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0895         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0896       </context>
0897       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocVariables">
0898         <IncludeRules context="DispatchSubstVariables"/>
0899         <IncludeRules context="DispatchVarNameVariables"/>
0900         <DetectChar attribute="Here Doc" context="#pop" char="$"/>
0901       </context>
0902 
0903       <!-- VarName consumes spare variable names and assignments -->
0904       <context attribute="Normal Text" lineEndContext="#pop" name="VarName">
0905         <StringDetect attribute="Builtin" context="#pop!BuiltinGetopts" String="getopts"/>
0906         <StringDetect attribute="Builtin" context="#pop!BuiltinLet" String="let"/>
0907         <DetectIdentifier attribute="Builtin" context="#pop!VarNameArgs"/>
0908         <AnyChar attribute="Builtin" context="#pop!VarNameArgs" String=".:-"/>
0909       </context>
0910       <context attribute="Normal Text" lineEndContext="#pop" name="VarNameArgs" fallthroughContext="#pop!CommandArgs">
0911         <DetectSpaces attribute="Normal Text" context="VarNameArg"/>
0912         <LineContinue attribute="Escape" context="#stay"/>
0913       </context>
0914       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameArg" fallthroughContext="#pop!VarNameArg2">
0915         <!-- In command arguments, do not allow comments after escaped characters.
0916              This avoids highlighting comments within paths or other text. Ex: pathtext\ #no\ comment -->
0917         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0918         <AnyChar attribute="Option" context="#pop!ShortOption" String="-+"/>
0919         <DetectChar attribute="Keyword" context="#pop!VarNameArg2" char="="/>
0920       </context>
0921       <context attribute="Normal Text" lineEndContext="#pop" name="VarNameArg2" fallthroughContext="#pop!NormalOption">
0922         <DetectChar attribute="Variable" context="Subscript" char="["/>
0923         <DetectChar attribute="Operator" context="Assign" char="="/>
0924         <DetectChar attribute="Variable" context="AssignArray" char="("/>
0925         <DetectIdentifier attribute="Variable" context="#stay"/>
0926       </context>
0927       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetopts" fallthroughContext="#pop!CommandArgs">
0928         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinGetoptsOpt"/>
0929         <LineContinue attribute="Escape" context="#stay"/>
0930       </context>
0931       <context attribute="Normal Text" lineEndContext="#pop#pop" name="BuiltinGetoptsOpt" fallthroughContext="#pop!BuiltinGetoptsOpt2">
0932         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0933         <DetectChar attribute="Keyword" context="#pop!NormalOption" char="="/>
0934       </context>
0935       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetoptsOpt2" fallthroughContext="#pop!NormalOption">
0936         <DetectChar attribute="Operator" context="#stay" char=":"/>
0937         <DetectIdentifier attribute="Normal Text" context="#stay" />
0938         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinGetoptsVar"/>
0939         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0940         <IncludeRules context="FindWord"/>
0941         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0942         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
0943         <AnyChar attribute="Normal Text" context="#stay" String="/%.0123456789"/>
0944       </context>
0945       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetoptsVar" fallthroughContext="#pop!CommandArgs">
0946         <DetectIdentifier attribute="Variable" context="#pop!CommandArgs"/>
0947       </context>
0948       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLet" fallthroughContext="#pop!CommandArgs">
0949         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinLetArgs"/>
0950         <LineContinue attribute="Escape" context="#stay"/>
0951       </context>
0952       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetArgs" fallthroughContext="BuiltinLetArg">
0953         <AnyChar context="BuiltinLetArgsNumber" String="0123456789" lookAhead="1"/>
0954         <IncludeRules context="CommandArgs"/>
0955       </context>
0956       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetArgsNumber" fallthroughContext="#pop!BuiltinLetArg">
0957         <IncludeRules context="FindRedirection"/>
0958       </context>
0959       <context attribute="Normal Text" lineEndContext="#pop#pop" name="BuiltinLetArg" fallthroughContext="#pop!BuiltinLetExpr">
0960         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0961         <DetectChar attribute="Keyword" context="#pop!NormalOption" char="="/>
0962       </context>
0963       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetExpr" fallthroughContext="#pop!NormalOption">
0964         <DetectIdentifier attribute="Variable" context="#stay" />
0965         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0966         <AnyChar attribute="Operator" context="#stay" String="+-!%=^:"/>
0967         <AnyChar context="Number" String="0123456789." lookAhead="1"/>
0968         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0969         <IncludeRules context="FindWord"/>
0970         <Detect2Chars attribute="BaseN" context="NoPrefix" char="#" char1="#"/>
0971         <DetectChar attribute="Error" context="#stay" char="#"/>
0972         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0973         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
0974       </context>
0975 
0976       <!-- ProcessSubst handles <(command) and >(command) -->
0977       <context attribute="Normal Text" lineEndContext="#stay" name="ProcessSubst" fallthroughContext="Command">
0978         <DetectChar attribute="Redirection" context="#pop" char=")"/>
0979         <IncludeRules context="Start"/>
0980       </context>
0981 
0982       <!-- StringSQ consumes anything till ' -->
0983       <context attribute="String SingleQ" lineEndContext="#stay" name="StringSQ">
0984         <DetectSpaces attribute="String SingleQ"/>
0985         <DetectIdentifier attribute="String SingleQ"/>
0986         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
0987       </context>
0988 
0989       <!-- StringDQ consumes anything till ", substitutes vars and expressions -->
0990       <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQ">
0991         <DetectSpaces attribute="String DoubleQ"/>
0992         <DetectIdentifier attribute="String DoubleQ"/>
0993         <DetectChar attribute="String DoubleQ" context="#pop" char="&quot;"/>
0994         <DetectChar context="StringDQEscape" char="\" lookAhead="1"/>
0995         <DetectChar context="StringDQDispatchVariables" char="$" lookAhead="1"/>
0996         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
0997       </context>
0998       <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQDispatchVariables">
0999         <IncludeRules context="DispatchSubstVariables"/>
1000         <IncludeRules context="DispatchVarNameVariables"/>
1001         <DetectChar attribute="String DoubleQ" context="#pop" char="$"/>
1002       </context>
1003       <context attribute="String DoubleQ" lineEndContext="#pop" name="StringDQEscape">
1004         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="&quot;"/>
1005         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="\"/>
1006         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="`"/>
1007         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="$"/>
1008         <LineContinue attribute="String Escape" context="#pop"/>
1009         <DetectChar attribute="String DoubleQ" context="#pop" char="\"/>
1010       </context>
1011 
1012       <!-- RegularBackq consumes anything till ` -->
1013       <context attribute="Normal Text" lineEndContext="#stay" name="RegularBackq" fallthroughContext="Command">
1014         <DetectChar attribute="Backquote" context="#pop" char="`"/>
1015         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
1016         <IncludeRules context="Start"/>
1017       </context>
1018 
1019       <!-- StringEsc eats till ', but escaping many characters -->
1020       <context attribute="String SingleQ" lineEndContext="#stay" name="StringEsc">
1021         <DetectSpaces attribute="String SingleQ"/>
1022         <DetectIdentifier attribute="String SingleQ"/>
1023         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
1024         <RegExpr attribute="String Escape" context="#stay" String="\\(?:[abefnrtv\\']|[0-7]{1,3}|x[A-Fa-f0-9]{1,2}|c.)"/>
1025       </context>
1026 
1027       <context attribute="Normal Text" lineEndContext="#stay" name="FindWord">
1028         <IncludeRules context="FindStrings"/>
1029         <DetectChar context="RegularVariable" char="$" lookAhead="1"/>
1030         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1031         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1032       </context>
1033       <context attribute="Normal Text" lineEndContext="#pop" name="RegularVariable">
1034         <IncludeRules context="DispatchVariables"/>
1035         <DetectChar attribute="Normal Text" context="#pop" char="$"/>
1036       </context>
1037 
1038       <context attribute="Normal Text" lineEndContext="#pop" name="FindStrings">
1039         <DetectChar attribute="String SingleQ" context="StringSQ" char="'"/>
1040         <DetectChar attribute="String DoubleQ" context="StringDQ" char="&quot;"/>
1041       </context>
1042 
1043       <!-- SubstCommand is called after a $( is encountered -->
1044       <context attribute="Normal Text" lineEndContext="#stay" name="SubstCommand" fallthroughContext="Command">
1045         <DetectChar attribute="Parameter Expansion" context="#pop" char=")" endRegion="subshell"/>
1046         <IncludeRules context="Start"/>
1047       </context>
1048 
1049       <!-- VarBraceStart is called as soon as ${ is encoutered -->
1050       <context attribute="Variable" lineEndContext="#pop" name="VarBraceStart" fallthroughContext="#pop!CheckVarAlt">
1051         <DetectChar attribute="Parameter Expansion" context="#pop!VarFlags" char="("/>
1052         <IncludeRules context="VarFlagsVar"/>
1053       </context>
1054       <context attribute="Variable" lineEndContext="#stay" name="VarBraceStartRecursive" fallthroughContext="#pop#pop!CheckVarAlt">
1055         <Detect2Chars attribute="Parameter Expansion" context="VarBraceStart" char="$" char1="{"/>
1056         <StringDetect context="#pop!ExprDblParenSubstOrSubstCommand" String="$((" lookAhead="1"/>
1057         <Detect2Chars attribute="Parameter Expansion" context="#pop!SubstCommand" char="$" char1="(" beginRegion="subshell"/>
1058         <DetectChar attribute="Error" context="#pop" char="$"/>
1059       </context>
1060       <context attribute="Error" lineEndContext="#stay" name="VarError">
1061         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1062       </context>
1063       <context attribute="Normal Text" lineEndContext="#stay" name="CheckVarAlt" fallthroughContext="#pop!VarError">
1064         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1065         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[@]"/>
1066         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[*]"/>
1067         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1068         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="%" char1="%"/>
1069         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="#" char1="#"/>
1070         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" String="#%"/>
1071         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" String="-+=?"/>
1072         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValuePrefix" char=":"/>
1073         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarBraceSubst" char="/" char1="/"/>
1074         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceSubst" char="/"/>
1075       </context>
1076       <context attribute="Parameter Expansion" lineEndContext="#stay" name="AlternateValuePrefix" fallthroughContext="#pop!VarSub">
1077         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="^" char1="^"/>
1078         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="#"/>
1079         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" String="-+=?|*^"/>
1080         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char=":" char1="="/>
1081         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceSubst" char="/"/>
1082 
1083         <!-- Modifiers -->
1084         <AnyChar attribute="Parameter Expansion" context="#pop!VarBraceModifiers" String="aAcehlpPqQrsg&amp;tux" lookAhead="1"/>
1085       </context>
1086 
1087       <!-- called as soon as ${xxx:y (with y a modifier) is encoutered -->
1088       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarBraceModifiers">
1089         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1090         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
1091         <AnyChar attribute="Parameter Expansion" context="VarBraceModifier_h" String="ht"/>
1092         <DetectChar attribute="Parameter Expansion" context="VarBraceModifier_s" char="s"/>
1093         <Detect2Chars attribute="Parameter Expansion" context="VarBraceModifier_s" char="g" char1="s"/>
1094       </context>
1095       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarBraceModifier_h" fallthroughContext="#pop">
1096         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
1097       </context>
1098 
1099       <!-- called as soon as ${xxx:s and ${xxx:gs is encoutered -->
1100       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarBraceModifier_s">
1101         <DetectChar attribute="Error" context="#pop#pop" char="}"/>
1102         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceModifier_s_Str" char="/"/>
1103         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1104       </context>
1105       <context attribute="String SingleQ" lineEndContext="#stay" name="VarBraceModifier_s_Str">
1106         <DetectChar attribute="Parameter Expansion" context="#pop#pop" char="}"/>
1107         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceModifier_s_Rep" char="/"/>
1108         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1109         <DetectChar attribute="String SingleQ" context="RecursiveVarBraceModifier_s" char="{"/>
1110       </context>
1111       <context attribute="String SingleQ" lineEndContext="#stay" name="RecursiveVarBraceModifier_s">
1112         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1113         <DetectChar attribute="String SingleQ" context="#pop" char="}"/>
1114       </context>
1115       <context attribute="String SingleQ" lineEndContext="#stay" name="VarBraceModifier_s_Rep">
1116         <DetectChar attribute="Parameter Expansion" context="#pop#pop" char="}"/>
1117         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="/"/>
1118         <DetectChar attribute="String SingleQ" context="RecursiveVarBraceModifier_s" char="{"/>
1119       </context>
1120 
1121       <!-- called as soon as ${xxx: is encoutered -->
1122       <context attribute="Normal Text" lineEndContext="#stay" name="VarSub">
1123         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1124         <AnyChar context="VarOffset" String="0123456789" lookAhead="1"/>
1125         <AnyChar attribute="Operator" context="#stay" String="+-!~*/%&lt;>=&amp;^|"/>
1126         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
1127         <DetectChar context="VarVariables" char="$" lookAhead="1"/>
1128         <IncludeRules context="FindStrings"/>
1129         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1130         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1131       </context>
1132       <context attribute="Command" lineEndContext="#pop" name="VarVariables">
1133         <IncludeRules context="DispatchVariables"/>
1134         <DetectChar attribute="Error" context="#pop" char="$"/>
1135       </context>
1136       <context attribute="Number" lineEndContext="#pop" name="VarOffset" fallthroughContext="#pop">
1137         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="x"/>
1138         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="X"/>
1139         <AnyChar attribute="Number" context="#stay" String="0123456789_"/>
1140         <DetectChar attribute="Base" context="#stay" char="#"/>
1141       </context>
1142 
1143       <!-- called as soon as ${xxx:-, etc are encoutered -->
1144       <context attribute="String DoubleQ" lineEndContext="#stay" name="AlternateValue">
1145         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1146         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1147         <IncludeRules context="FindWord"/>
1148         <IncludeRules context="FindPathThenPopInAlternateValue"/>
1149         <DetectIdentifier attribute="String DoubleQ"/>
1150       </context>
1151       <context attribute="String DoubleQ" lineEndContext="#stay" name="RecursiveAlternateValue">
1152         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1153         <DetectChar attribute="String DoubleQ" context="#pop" char="}"/>
1154         <IncludeRules context="FindWord"/>
1155         <IncludeRules context="FindPathThenPopInAlternateValue"/>
1156         <DetectIdentifier attribute="String DoubleQ"/>
1157       </context>
1158 
1159       <!-- called as soon as ${xxx%, etc are encoutered -->
1160       <context attribute="String DoubleQ" lineEndContext="#stay" name="AlternatePatternValue">
1161         <DetectChar attribute="String DoubleQ" context="RecursiveAlternatePatternValue" char="{"/>
1162         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1163         <IncludeRules context="FindWord"/>
1164         <IncludeRules context="FindStringDQPattern"/>
1165         <DetectIdentifier attribute="String DoubleQ"/>
1166       </context>
1167       <context attribute="String DoubleQ" lineEndContext="#stay" name="RecursiveAlternatePatternValue">
1168         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1169         <DetectChar attribute="String DoubleQ" context="#pop" char="}"/>
1170         <IncludeRules context="FindWord"/>
1171         <IncludeRules context="FindStringDQPattern"/>
1172         <DetectIdentifier attribute="String DoubleQ"/>
1173       </context>
1174 
1175       <!-- called as soon as ${xxx/ ${xxx// ${xxx:/ are encoutered -->
1176       <context attribute="Normal Text" lineEndContext="#stay" name="VarBraceSubst" fallthroughContext="#pop!VarBraceSubstPat">
1177         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarBraceSubstPat" char="#" char1="%"/>
1178         <AnyChar attribute="Parameter Expansion Operator" context="#pop!VarBraceSubstPat" String="#%"/>
1179       </context>
1180       <context attribute="Pattern" lineEndContext="#stay" name="VarBraceSubstPat">
1181         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="/"/>
1182         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1183         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1184         <IncludeRules context="FindWord"/>
1185         <IncludeRules context="FindSubPattern"/>
1186         <DetectIdentifier attribute="Pattern"/>
1187       </context>
1188 
1189       <!-- called as soon as ${( is encoutered -->
1190       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlags">
1191         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="#%*q@AabcCDefFikLnoOPqQ+-tuUvVwWXz0~mSBEMNR"/>
1192         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_s" String="sjgZ_"/>
1193         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_l" String="lrI"/>
1194         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlagsSubs" char="p"/>
1195 
1196         <DetectChar attribute="Parameter Expansion" context="#pop!VarFlagsVar" char=")"/>
1197         <DetectChar attribute="Error" context="#pop" char="}"/>
1198       </context>
1199       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlagsSubs">
1200         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="#q@AabcCDefFikLnoOPqQ+-tuUvVwWXz0~mSBEMNRp"/>
1201         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_s" String="gZ"/>
1202         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_ps" String="sj_"/>
1203         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_pl" String="lrI"/>
1204 
1205         <DetectChar attribute="Parameter Expansion" context="#pop!VarFlagsVar" char=")"/>
1206         <DetectChar attribute="Error" context="#pop" char="}"/>
1207       </context>
1208       <context attribute="Variable" lineEndContext="#stay" name="VarFlagsVar" fallthroughContext="#pop!CheckVarAlt">
1209         <DetectChar context="VarBraceStartRecursive" char="$" lookAhead="1"/>
1210         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1211         <DetectChar attribute="String DoubleQ" context="StringDQ" char="&quot;"/>
1212         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="#+^=~"/>
1213         <DetectIdentifier attribute="Variable" context="#pop!CheckVarAlt"/>
1214         <AnyChar attribute="Variable" context="#pop!CheckVarAlt" String="*@?$-"/>
1215         <Int attribute="Variable" context="#pop!CheckVarAlt" additionalDeliminator="#~=^+{}[]:-/$"/>
1216         <Detect2Chars context="#pop!VarSubShell" char="!" char1="}" lookAhead="1"/>
1217         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="!"/>
1218       </context>
1219 
1220       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarSubShell">
1221         <DetectChar attribute="Variable" context="#pop!CheckVarAlt" char="!"/>
1222       </context>
1223 
1224       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlag_s">
1225         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s[" char="["/>
1226         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s&lt;" char="&lt;"/>
1227         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s{" char="{"/>
1228         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s(" char="("/>
1229         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_sx" String="(.)"/>
1230       </context>
1231       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s[">
1232         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1233       </context>
1234       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s&lt;">
1235         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1236       </context>
1237       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s{">
1238         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1239       </context>
1240       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s(">
1241         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1242       </context>
1243       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_sx">
1244         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1245       </context>
1246 
1247       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l">
1248         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l[" char="["/>
1249         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l&lt;" char="&lt;"/>
1250         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l{" char="{"/>
1251         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l(" char="("/>
1252         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_lx" String="(.)"/>
1253       </context>
1254       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l[">
1255         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l[s" char="]" char1="["/>
1256         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1257         <IncludeRules context="FindExprDblParen"/>
1258       </context>
1259       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l&lt;">
1260         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l&lt;s" char=">" char1="&lt;"/>
1261         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1262         <IncludeRules context="FindExprDblParen"/>
1263       </context>
1264       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l{">
1265         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l{s" char="}" char1="{"/>
1266         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1267         <IncludeRules context="FindExprDblParen"/>
1268       </context>
1269       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l(">
1270         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l(s" char=")" char1="("/>
1271         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1272         <IncludeRules context="FindExprDblParen"/>
1273       </context>
1274       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_lx">
1275         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_lxs" String="(%1)%1" dynamic="1"/>
1276         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1277         <IncludeRules context="FindExprDblParen"/>
1278       </context>
1279       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l[s">
1280         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="]" char1="["/>
1281         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1282       </context>
1283       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l&lt;s">
1284         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=">" char1="&lt;"/>
1285         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1286       </context>
1287       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l{s">
1288         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="}" char1="{"/>
1289         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1290       </context>
1291       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l(s">
1292         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=")" char1="("/>
1293         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1294       </context>
1295       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_lxs">
1296         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="%1%1" dynamic="1"/>
1297         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1298       </context>
1299 
1300       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlag_ps">
1301         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps[" char="["/>
1302         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps&lt;" char="&lt;"/>
1303         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps{" char="{"/>
1304         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps(" char="("/>
1305         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_psx" String="(.)"/>
1306       </context>
1307       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps[">
1308         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1309         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=\])"/>
1310       </context>
1311       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps&lt;">
1312         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1313         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=>)"/>
1314       </context>
1315       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps{">
1316         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1317         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=})"/>
1318       </context>
1319       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps(">
1320         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1321         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=\))"/>
1322       </context>
1323       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_psx">
1324         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1325         <RegExpr attribute="Variable" context="#stay" String="\$(?!%1)(?:[A-Za-z_](?:(?!%1)[A-Za-z0-9_])*+|(?:(?!%1)[0-9])++)(?=%1)" dynamic="1"/>
1326         <RegExpr attribute="String SingleQ" context="#stay" String="[^%1]+" dynamic="1"/>
1327       </context>
1328 
1329       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl">
1330         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl[" char="["/>
1331         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl&lt;" char="&lt;"/>
1332         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl{" char="{"/>
1333         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl(" char="("/>
1334         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_plx" String="(.)"/>
1335       </context>
1336       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl[">
1337         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl[s" char="]" char1="["/>
1338         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1339         <IncludeRules context="FindExprDblParen"/>
1340       </context>
1341       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl&lt;">
1342         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl&lt;s" char=">" char1="&lt;"/>
1343         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1344         <IncludeRules context="FindExprDblParen"/>
1345       </context>
1346       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl{">
1347         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl{s" char="}" char1="{"/>
1348         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1349         <IncludeRules context="FindExprDblParen"/>
1350       </context>
1351       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl(">
1352         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl(s" char=")" char1="("/>
1353         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1354         <IncludeRules context="FindExprDblParen"/>
1355       </context>
1356       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_plx">
1357         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_plxs" String="(%1)%1" dynamic="1"/>
1358         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1359         <IncludeRules context="FindExprDblParen"/>
1360       </context>
1361       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl[s">
1362         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="]" char1="["/>
1363         <IncludeRules context="VarFlag_ps["/>
1364       </context>
1365       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl&lt;s">
1366         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=">" char1="&lt;"/>
1367         <IncludeRules context="VarFlag_ps&lt;"/>
1368       </context>
1369       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl{s">
1370         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="}" char1="{"/>
1371         <IncludeRules context="VarFlag_ps{"/>
1372       </context>
1373       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl(s">
1374         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=")" char1="("/>
1375         <IncludeRules context="VarFlag_ps("/>
1376       </context>
1377       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_plxs">
1378         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="%1%1" dynamic="1"/>
1379         <IncludeRules context="VarFlag_psx"/>
1380       </context>
1381 
1382       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansion">
1383         <DetectChar attribute="Escape" context="#pop!BraceExpansion2" char="{"/>
1384       </context>
1385       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansion2">
1386         <DetectChar attribute="Operator" context="#stay" char=","/>
1387         <DetectChar attribute="Escape" context="#pop" char="}"/>
1388         <DetectChar context="EscapeMaybeBraceExpansion" char="{" lookAhead="1"/>
1389         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1390         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
1391         <DetectChar context="BraceExpansionVariables" char="$" lookAhead="1"/>
1392         <IncludeRules context="FindStrings"/>
1393         <IncludeRules context="FindPattern"/>
1394         <DetectIdentifier attribute="Escape"/>
1395       </context>
1396       <context attribute="Escape" lineEndContext="#pop" name="EscapeMaybeBraceExpansion">
1397         <IncludeRules context="DispatchBraceExpansion"/>
1398         <DetectChar attribute="Escape" context="#pop!BraceExpansion2" char="{"/>
1399       </context>
1400       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansionVariables">
1401         <IncludeRules context="DispatchVariables"/>
1402         <DetectChar attribute="Escape" context="#pop" char="$"/>
1403       </context>
1404 
1405       <context attribute="Escape" lineEndContext="#pop" name="PathBraceExpansion">
1406         <DetectChar attribute="Escape" context="#pop!PathBraceExpansion2" char="{"/>
1407       </context>
1408       <context attribute="Path" lineEndContext="#pop" name="PathBraceExpansion2">
1409         <DetectChar attribute="Operator" context="#stay" char=","/>
1410         <DetectChar attribute="Escape" context="#pop" char="}"/>
1411         <DetectChar context="PathMaybeBraceExpansion" char="{" lookAhead="1"/>
1412         <IncludeRules context="FindWord"/>
1413         <IncludeRules context="FindPattern"/>
1414         <DetectIdentifier attribute="Path"/>
1415       </context>
1416 
1417       <context attribute="Normal Text" lineEndContext="#pop" name="SequenceExpression">
1418         <AnyChar attribute="Number" context="#stay" String="0123456789-"/>
1419         <IncludeRules context="FindWord"/>
1420         <Detect2Chars attribute="Escape" context="#stay" char="." char1="."/>
1421         <DetectChar attribute="Escape" context="#pop" char="}"/>
1422       </context>
1423 
1424 <!-- ====== These are the contexts that can be branched to ======= -->
1425 
1426       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenOrSubShell">
1427         <RegExpr attribute="Keyword" context="#pop!SubShell" String="\((?=&arithmetic_as_subshell;)|" beginRegion="subshell"/>
1428         <Detect2Chars attribute="Keyword" context="#pop!ExprDblParen" char="(" char1="(" beginRegion="expression"/>
1429       </context>
1430       <!-- ExprDblParen consumes an expression started in command mode till )) -->
1431       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParen">
1432         <DetectSpaces attribute="Normal Text" context="#stay"/>
1433         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")" endRegion="expression"/>
1434         <IncludeRules context="FindExprDblParen"/>
1435         <!-- ((cmd
1436               ) # jump to SubShell context -->
1437         <DetectChar attribute="Keyword" context="#pop!SubShell" char=")" endRegion="expression" beginRegion="subshell"/>
1438       </context>
1439       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprDblParen">
1440         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="&amp;"/>
1441         <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
1442         <AnyChar attribute="Operator" context="#stay" String="+-!~*/%&lt;>=&amp;^|?:"/>
1443         <DetectChar attribute="Control" context="#stay" char=","/>
1444         <DetectChar attribute="Normal Text" context="ExprSubDblParen" char="("/>
1445         <AnyChar context="Number" String="0123456789." lookAhead="1"/>
1446         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1447         <IncludeRules context="FindWord"/>
1448         <DetectChar context="MaybeArithmeticBrace" char="{" lookAhead="1"/>
1449         <Detect2Chars attribute="BaseN" context="NoPrefix" char="#" char1="#"/>
1450         <DetectChar attribute="Error" context="#stay" char="#"/>
1451         <DetectIdentifier attribute="Variable" context="#stay"/>
1452       </context>
1453       <context attribute="Normal Text" lineEndContext="#stay" name="ExprSubDblParen">
1454         <DetectSpaces attribute="Normal Text" context="#stay"/>
1455         <DetectChar attribute="Normal Text" context="#pop" char=")"/>
1456         <IncludeRules context="FindExprDblParen"/>
1457       </context>
1458       <context attribute="Error" lineEndContext="#pop" name="MaybeArithmeticBrace">
1459         <IncludeRules context="DispatchBraceExpansion"/>
1460         <DetectChar attribute="Error" context="#pop" char="{"/>
1461       </context>
1462       <context attribute="Normal Text" lineEndContext="#pop" name="NoPrefix" fallthroughContext="#pop">
1463         <DetectChar context="AssumeEscape" char="\"/>
1464         <RegExpr attribute="Number" context="#pop" String="[^][()]"/>
1465       </context>
1466 
1467       <context attribute="Number" lineEndContext="#pop" name="Number">
1468         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="x"/>
1469         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="X"/>
1470         <RegExpr attribute="Base" context="#pop!BaseN" String="[1-9][0-9_]*+#"/>
1471         <RegExpr attribute="Number" context="#pop" String="&int;(\.(&int;&exp;?+|&exp;)?|&exp;)?|\.&int;&exp;?"/>
1472         <DetectChar attribute="Operator" context="#pop" char="."/>
1473       </context>
1474       <context attribute="Hex" lineEndContext="#pop" name="Hex" fallthroughContext="#pop">
1475         <RegExpr attribute="Hex" context="#pop" String="[0-9a-fA-F_]+"/>
1476       </context>
1477       <context attribute="BaseN" lineEndContext="#pop" name="BaseN" fallthroughContext="#pop">
1478         <RegExpr attribute="BaseN" context="#pop" String="[0-9a-zA-Z@_]+"/>
1479       </context>
1480 
1481       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubstOrSubstCommand">
1482         <RegExpr attribute="Parameter Expansion" context="#pop!SubstCommand" String="\$\((?=&arithmetic_as_subshell;)|" beginRegion="subshell"/>
1483         <StringDetect attribute="Parameter Expansion" context="#pop!ExprDblParenSubst" String="$((" beginRegion="expression"/>
1484       </context>
1485       <!-- ExprDblParenSubst like ExprDblParen but matches )) as Variable -->
1486       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubst">
1487         <DetectSpaces attribute="Normal Text" context="#stay"/>
1488         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=")" char1=")" endRegion="expression"/>
1489         <IncludeRules context="FindExprDblParen"/>
1490         <!-- $((cmd
1491               ) # jump to SubstCommand context -->
1492         <DetectChar attribute="Parameter Expansion" context="#pop!SubstCommand" char=")" endRegion="expression" beginRegion="subshell"/>
1493       </context>
1494 
1495       <!-- ExprBracket consumes an expression till ] -->
1496       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracket" fallthroughContext="#pop!ExprBracketNot">
1497         <DetectSpaces attribute="Normal Text" context="#stay"/>
1498         <IncludeRules context="FindExprBracketEnd"/>
1499       </context>
1500 
1501       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketNot" fallthroughContext="#pop!ExprBracketParam1">
1502         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam1"/>
1503         <Detect2Chars attribute="Expression" context="ExprBracketTestMaybeNot" char="!" char1=" " lookAhead="1"/>
1504         <Detect2Chars attribute="Expression" context="ExprBracketTestMaybeNot" char="!" char1="&tab;" lookAhead="1"/>
1505       </context>
1506       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketTestMaybeNot">
1507         <DetectChar attribute="Expression" context="#pop" char="!"/>
1508       </context>
1509 
1510       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketParam1" fallthroughContext="ExprBracketValue">
1511         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam2"/>
1512         <DetectChar context="TestMaybeUnary" char="-" lookAhead="1"/>
1513         <IncludeRules context="FindExprBracketEnd"/>
1514       </context>
1515 
1516       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValue">
1517         <AnyChar context="#pop" String=" &tab;" lookAhead="1"/>
1518         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1519         <IncludeRules context="FindWord"/>
1520         <IncludeRules context="FindGlobAny"/>
1521         <IncludeRules context="FindPathThenPop"/>
1522         <DetectChar context="ExprBracketValueMaybeBraceExpansion" char="{" lookAhead="1"/>
1523         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
1524         <DetectIdentifier attribute="Normal Text"/>
1525       </context>
1526       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValueRecBrace">
1527         <AnyChar context="#pop#pop" String=" &tab;" lookAhead="1"/>
1528         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1529         <IncludeRules context="FindWord"/>
1530         <IncludeRules context="FindGlobAny"/>
1531         <DetectChar context="ExprBracketValueMaybeBraceExpansion" char="{" lookAhead="1"/>
1532         <DetectChar attribute="Normal Text" context="#pop" char="}"/>
1533         <DetectIdentifier attribute="Normal Text"/>
1534       </context>
1535       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValueMaybeBraceExpansion">
1536         <IncludeRules context="DispatchBraceExpansion"/>
1537         <DetectChar attribute="Normal Text" context="#pop!ExprBracketValueRecBrace" char="{"/>
1538       </context>
1539 
1540       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketParam2" fallthroughContext="ExprBracketValue">
1541         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam3"/>
1542         <AnyChar context="TestMaybeBinary" String="-=!" lookAhead="1"/>
1543         <IncludeRules context="FindExprBracketEnd"/>
1544       </context>
1545 
1546       <context attribute="Normal Text" lineEndContext="ExprBracketFinal" name="ExprBracketParam3" fallthroughContext="ExprBracketValue">
1547         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketFinal"/>
1548         <IncludeRules context="FindExprBracketEnd"/>
1549       </context>
1550 
1551       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketFinal" fallthroughContext="ExprBracketValue">
1552         <DetectSpaces attribute="Normal Text" context="#stay"/>
1553         <IncludeRules context="FindExprBracketEnd"/>
1554         <RegExpr attribute="Expression" context="#pop!ExprBracket" String="-[ao]&eos;"/>
1555         <RegExpr attribute="Error" context="#pop" String="(?:[^] &tab;]++|\][^ &tab;])++" endRegion="expression"/>
1556       </context>
1557 
1558       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprBracketEnd">
1559         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1560         <RegExpr attribute="Builtin" context="#pop" String="\](?=($|[ &tab;;|&amp;&lt;>)]))" endRegion="expression"/>
1561       </context>
1562 
1563       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeUnary" fallthroughContext="#pop!ExprBracketValue">
1564         <RegExpr attribute="Expression" context="#pop#pop!ExprBracketParam2" String="&unary_operators;"/>
1565       </context>
1566       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeBinary" fallthroughContext="#pop!ExprBracketValue">
1567         <RegExpr attribute="Expression" context="#pop" String="&binary_operators;"/>
1568       </context>
1569 
1570 
1571       <!-- ExprDblBracket consumes an expression till ]] -->
1572       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracket" fallthroughContext="#pop!ExprDblBracketNot">
1573         <DetectSpaces attribute="Normal Text" context="#stay"/>
1574         <IncludeRules context="FindExprDblBracketEnd"/>
1575         <DetectChar attribute="Comment" context="Comment" char="#"/>
1576       </context>
1577 
1578       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketNot" fallthroughContext="#pop!ExprDblBracketParam1">
1579         <DetectChar context="ExprDblBracketTestMaybeNot" char="!" lookAhead="1"/>
1580         <DetectSpaces attribute="Normal Text" context="#stay"/>
1581         <DetectChar attribute="Comment" context="Comment" char="#"/>
1582       </context>
1583       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketTestMaybeNot" fallthroughContext="#pop#pop!ExprDblBracketParam1">
1584         <RegExpr attribute="Expression" context="#pop" String="!(?=$|[ &tab;(])"/>
1585       </context>
1586 
1587       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam1" fallthroughContext="#pop!ExprDblBracketParam1_2">
1588         <DetectSpaces attribute="Normal Text" context="#stay"/>
1589       </context>
1590       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam1_2" fallthroughContext="ExprDblBracketValueText">
1591         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam2"/>
1592         <DetectChar context="TestMaybeUnary2" char="-" lookAhead="1"/>
1593         <DetectChar context="ExprDblBracketSubValue" char="(" lookAhead="1"/>
1594         <IncludeRules context="FindExprDblBracketEnd"/>
1595       </context>
1596       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeUnary2" fallthroughContext="#pop!ExprDblBracketValueText">
1597         <RegExpr attribute="Expression" context="#pop!ExprDblBracketUnary" String="&unary_operators;(?!\s+(?:=~|&binary_operators;))"/>
1598       </context>
1599       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketUnary" fallthroughContext="#pop!ExprDblBracketValueText">
1600         <DetectSpaces attribute="Normal Text"/>
1601         <DetectChar attribute="Comment" context="Comment" char="#"/>
1602       </context>
1603       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketSubValue" fallthroughContext="#pop">
1604         <DetectChar attribute="Operator" context="ExprDblBracketNot" char="("/>
1605         <DetectChar attribute="Operator" context="#pop" char=")"/>
1606       </context>
1607 
1608       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueText" fallthroughContext="#pop!ExprDblBracketValueText2">
1609         <Detect2Chars context="#pop!ExprDblBracketValueTextMaybeEnd" char="]" char1="]" lookAhead="1"/>
1610         <IncludeRules context="FindExprDblBracketValueTextPath"/>
1611       </context>
1612       <context attribute="Normal Text" lineEndContext="#pop" name="FindExprDblBracketValueTextPath">
1613         <RegExpr context="#pop!ExprDblBracketValueTextPath" String="&path_with_sep;|" lookAhead="1"/>
1614       </context>
1615       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueTextMaybeEnd">
1616         <RegExpr attribute="Keyword" context="#pop#pop" String="&dblbracket_close;" endRegion="expression"/>
1617         <IncludeRules context="FindExprDblBracketValueTextPath"/>
1618         <Detect2Chars context="#pop!ExprDblBracketValueText2" char="]" char1="]" lookAhead="1"/>
1619       </context>
1620       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueText2">
1621         <DetectIdentifier/>
1622         <AnyChar String="*?+@~^:%+-/,"/>
1623         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1624         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="|" char1="|"/>
1625         <AnyChar context="#pop" String=" &tab;)" lookAhead="1"/>
1626         <IncludeRules context="FindWord"/>
1627         <IncludeRules context="FindGroupPattern"/>
1628         <AnyChar attribute="Error" context="#stay" String="&amp;;|"/>
1629         <DetectChar context="ExprDblBracketValueTextMaybeRange" char="&lt;" lookAhead="1"/>
1630         <DetectChar attribute="Expression" context="#pop!ExprDblBracketValuePattern" char=">"/>
1631       </context>
1632       <context attribute="Path" lineEndContext="#pop" name="ExprDblBracketValueTextPath">
1633         <IncludeRules context="ExprDblBracketValueText2"/>
1634       </context>
1635       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueTextMaybeRange">
1636         <RegExpr context="#pop" String="&globrange;"/>
1637         <DetectChar attribute="Expression" context="#pop#pop!ExprDblBracketValuePattern" char="&lt;"/>
1638       </context>
1639 
1640       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePattern" fallthroughContext="#pop!ExprDblBracketValuePattern2">
1641         <RegExpr context="ExprDblBracketValuePatternPath" String="&path_with_sep;|" lookAhead="1"/>
1642       </context>
1643       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePatternPath" fallthroughContext="#pop!PathThenPop">
1644         <DetectChar attribute="Path" context="#pop!PathThenPop" char="~"/>
1645       </context>
1646       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePattern2">
1647         <DetectIdentifier attribute="Normal Text"/>
1648         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1649         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="|" char1="|"/>
1650         <AnyChar context="#pop" String=" &tab;)" lookAhead="1"/>
1651         <IncludeRules context="FindWord"/>
1652         <IncludeRules context="FindSingleGlob"/>
1653         <IncludeRules context="FindGlobAny"/>
1654         <IncludeRules context="FindGroupPattern"/>
1655         <DetectChar context="ExprDblBracketValueMaybeGlobRange" char="&lt;" lookAhead="1"/>
1656         <AnyChar attribute="Error" context="#stay" String=">&amp;|;"/>
1657       </context>
1658       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketValueMaybeGlobRange">
1659         <IncludeRules context="FindGlobRangeThenPop"/>
1660         <DetectChar attribute="Error" context="#pop" char="&lt;"/>
1661       </context>
1662 
1663       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam2" fallthroughContext="#pop!ExprDblBracketParam2_2">
1664         <DetectSpaces attribute="Normal Text" context="#stay"/>
1665         <DetectChar attribute="Comment" context="Comment" char="#"/>
1666       </context>
1667       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam2_2" fallthroughContext="ExprDblBracketValuePattern">
1668         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam3"/>
1669         <AnyChar context="TestMaybeBinary2" String="-=!" lookAhead="1"/>
1670         <AnyChar attribute="Expression" context="#pop!ExprDblBracketParam3Spe" String="&lt;>"/>
1671         <IncludeRules context="FindExprDblBracketEnd"/>
1672       </context>
1673       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeBinary2" fallthroughContext="#pop!ExprDblBracketValuePattern">
1674         <IncludeRules context="TestMaybeBinary"/>
1675         <RegExpr attribute="Expression" context="#pop#pop!ExprDblBracketRegex" String="=~&eos;"/>
1676       </context>
1677 
1678       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam3Spe" fallthroughContext="#pop!ExprDblBracketParam3">
1679         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam3"/>
1680       </context>
1681 
1682       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam3" fallthroughContext="#pop!ExprDblBracketParam3_2">
1683         <DetectSpaces attribute="Normal Text" context="#stay"/>
1684         <DetectChar attribute="Comment" context="Comment" char="#"/>
1685       </context>
1686       <context attribute="Normal Text" lineEndContext="#pop!ExprDblBracketFinal" name="ExprDblBracketParam3_2" fallthroughContext="ExprDblBracketValuePattern">
1687         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketFinal"/>
1688         <IncludeRules context="FindExprDblBracketEnd"/>
1689       </context>
1690 
1691       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketFinal" fallthroughContext="ExprDblBracketValuePattern">
1692         <DetectSpaces attribute="Normal Text" context="#stay"/>
1693         <IncludeRules context="FindExprDblBracketEnd"/>
1694         <DetectChar attribute="Comment" context="Comment" char="#"/>
1695         <RegExpr attribute="Error" context="#pop" String="(?:[^] &tab;]++|\](?:[^]]|\][^ &tab;]))++" endRegion="expression"/>
1696       </context>
1697 
1698       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprDblBracketEnd">
1699         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1700         <DetectChar context="#pop" char=")" lookAhead="1"/>
1701         <Detect2Chars attribute="Control" context="#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1702         <Detect2Chars attribute="Control" context="#pop!ExprDblBracket" char="|" char1="|"/>
1703         <RegExpr attribute="Keyword" context="#pop" String="&dblbracket_close;" endRegion="expression"/>
1704       </context>
1705 
1706       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketRegex" fallthroughContext="#pop!Regex">
1707         <DetectSpaces attribute="Normal Text" context="#stay"/>
1708         <DetectChar attribute="Comment" context="Comment" char="#"/>
1709       </context>
1710       <context attribute="Pattern" lineEndContext="#stay" name="Regex">
1711         <DetectIdentifier attribute="Pattern"/>
1712         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketFinal"/>
1713         <DetectChar attribute="Operator" context="#pop" char=")"/>
1714         <Detect2Chars attribute="Operator" context="RegexChar" char="[" char1="^"/>
1715         <DetectChar attribute="Operator" context="RegexChar" char="["/>
1716         <IncludeRules context="FindRegex"/>
1717       </context>
1718       <context attribute="Pattern" lineEndContext="#stay" name="ExprDblBracketSubRegex">
1719         <DetectIdentifier attribute="Pattern"/>
1720         <DetectSpaces attribute="Pattern" context="#stay"/>
1721         <DetectChar attribute="Operator" context="#pop" char=")"/>
1722         <Detect2Chars attribute="Operator" context="RegexSubChar" char="[" char1="^"/>
1723         <DetectChar attribute="Operator" context="RegexSubChar" char="["/>
1724         <IncludeRules context="FindRegex"/>
1725       </context>
1726 
1727       <context attribute="Pattern" lineEndContext="#stay" name="FindRegex">
1728         <DetectChar attribute="Operator" context="ExprDblBracketSubRegex" char="("/>
1729         <DetectChar attribute="Escape" context="RegexEscape" char="\"/>
1730         <DetectChar attribute="Parameter Expansion" context="RegexDup" char="{"/>
1731         <AnyChar attribute="Glob" context="#stay" String="^?+*.|"/>
1732         <IncludeRules context="FindStrings"/>
1733         <DetectChar context="RegexDispatchVariables" char="$" lookAhead="1"/>
1734         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1735       </context>
1736       <context attribute="Normal Text" lineEndContext="#stay" name="RegexDispatchVariables">
1737         <IncludeRules context="DispatchVariables"/>
1738         <DetectChar attribute="Operator" context="#pop" char="$"/>
1739       </context>
1740 
1741       <context attribute="Normal Text" lineEndContext="#pop" name="RegexEscape">
1742         <RegExpr attribute="Escape" context="#pop" String="x[0-9a-fA-F]{1,2}|[0-7]{1,3}|."/>
1743       </context>
1744 
1745       <context attribute="Normal Text" lineEndContext="#pop" name="RegexDup">
1746         <Int attribute="Number"/>
1747         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=","/>
1748         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1749       </context>
1750 
1751       <context attribute="Pattern" lineEndContext="#pop" name="RegexSubChar" fallthroughContext="#pop!RegexSubInChar">
1752         <AnyChar attribute="Pattern" context="#pop!RegexSubInChar" String="-]"/>
1753       </context>
1754       <context attribute="Pattern" lineEndContext="#pop" name="RegexSubInChar">
1755         <DetectSpaces attribute="Pattern" context="#stay"/>
1756         <IncludeRules context="RegexInChar"/>
1757       </context>
1758 
1759       <context attribute="Pattern" lineEndContext="#pop" name="RegexChar" fallthroughContext="#pop!RegexInChar">
1760         <AnyChar attribute="Pattern" context="#pop!RegexInChar" String="-]"/>
1761       </context>
1762       <context attribute="Pattern" lineEndContext="#pop" name="RegexInChar">
1763         <Detect2Chars context="RegexInCharEnd" char="-" char1="]" lookAhead="1"/>
1764         <DetectChar attribute="Operator" context="#stay" char="-"/>
1765         <DetectChar attribute="Escape" context="RegexEscape" char="\"/>
1766         <DetectChar context="RegexCharClassSelect" char="[" lookAhead="1"/>
1767         <DetectChar attribute="Operator" context="#pop" char="]"/>
1768         <AnyChar context="#pop" String="() &tab;" lookAhead="1"/>
1769         <IncludeRules context="FindStrings"/>
1770       </context>
1771       <context attribute="Operator" lineEndContext="#stay" name="RegexInCharEnd">
1772         <DetectChar attribute="Pattern" context="#stay" char="-"/>
1773         <DetectChar attribute="Operator" context="#pop#pop" char="]"/>
1774       </context>
1775       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCharClassSelect">
1776         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexCharClass" char="[" char1=":"/>
1777         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexCollatingSymbols" char="[" char1="."/>
1778         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexEquivalenceClass" char="[" char1="="/>
1779         <DetectChar attribute="Pattern" context="#pop" char="["/>
1780       </context>
1781 
1782       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCharClass">
1783         <DetectIdentifier attribute="Parameter Expansion"/>
1784         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char=":" char1="]"/>
1785         <DetectChar attribute="Error" context="#pop" char="]"/>
1786       </context>
1787       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCollatingSymbols">
1788         <DetectIdentifier attribute="Parameter Expansion"/>
1789         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char="." char1="]"/>
1790         <DetectChar attribute="Error" context="#pop" char="]"/>
1791       </context>
1792       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexEquivalenceClass">
1793         <DetectIdentifier attribute="Parameter Expansion"/>
1794         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char="=" char1="]"/>
1795         <DetectChar attribute="Error" context="#pop" char="]"/>
1796       </context>
1797 
1798       <!-- SubShell consumes shell input till ) -->
1799       <context attribute="Normal Text" lineEndContext="#stay" name="SubShell" fallthroughContext="Command">
1800         <DetectChar attribute="Keyword" context="#pop" char=")" endRegion="subshell"/>
1801         <IncludeRules context="Start"/>
1802       </context>
1803 
1804       <!-- Assign consumes an expression till EOL or whitespace -->
1805       <context attribute="Normal Text" lineEndContext="#pop" name="Assign" fallthroughContext="#pop!RegularAssign">
1806         <DetectChar attribute="Variable" context="#pop!AssignArray" char="("/>
1807       </context>
1808       <context attribute="Normal Text" lineEndContext="#pop" name="RegularAssign" fallthroughContext="#pop">
1809         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1810         <IncludeRules context="NormalOption"/>
1811       </context>
1812 
1813       <!-- AssignArray consumes everything till ), marking assignments -->
1814       <context attribute="Normal Text" lineEndContext="#stay" name="AssignArray" fallthroughContext="NormalOption">
1815         <DetectSpaces attribute="Normal Text" context="#stay"/>
1816         <DetectChar attribute="Comment" context="Comment" char="#"/>
1817         <DetectChar attribute="Variable" context="#pop" char=")"/>
1818         <DetectChar context="AssignArrayKey" char="[" lookAhead="1"/>
1819         <DetectChar attribute="Backquote" context="AssignArrayBackq" char="`"/>
1820         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1821       </context>
1822       <context attribute="Normal Text" lineEndContext="#pop" name="AssignArrayKey" fallthroughContext="#pop">
1823         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1824         <DetectChar attribute="Variable" context="#pop" char="="/>
1825       </context>
1826       <context attribute="Normal Text" lineEndContext="#stay" name="AssignArrayBackq" fallthroughContext="Command">
1827         <DetectChar attribute="Backquote" context="#pop!NormalOption" char="`"/>
1828         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
1829         <IncludeRules context="Start"/>
1830       </context>
1831 
1832       <!-- Subscript consumes anything till ], marks as Variable -->
1833       <context attribute="Normal Text" lineEndContext="#stay" name="Subscript" fallthroughContext="Subscript2">
1834         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1835         <AnyChar attribute="Number" context="#stay" String="0123456789-"/>
1836       </context>
1837       <context attribute="Normal Text" lineEndContext="#stay" name="Subscript2">
1838         <DetectIdentifier attribute="Normal Text"/>
1839         <DetectChar attribute="Parameter Expansion Operator" context="#pop#pop" char="]"/>
1840         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=","/>
1841         <IncludeRules context="FindGroupPattern"/>
1842         <IncludeRules context="FindStrings"/>
1843         <DetectChar context="VariableOrSubscriptPos" char="$" lookAhead="1"/>
1844         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1845         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1846         <AnyChar attribute="Operator" context="#pop" String="@+-!~*/%&lt;>=&amp;^|?:"/>
1847       </context>
1848       <context attribute="Normal Text" lineEndContext="#pop" name="VariableOrSubscriptPos">
1849         <IncludeRules context="DispatchVariables"/>
1850         <DetectChar attribute="Number" context="#pop" char="$"/>
1851       </context>
1852 
1853       <!-- FunctionDef consumes a name, possibly with (), marks as Function -->
1854       <context attribute="Function" lineEndContext="#pop" name="FunctionDef" fallthroughContext="#pop">
1855         <Detect2Chars attribute="Operator" context="#pop" char="(" char1=")"/>
1856         <DetectSpaces attribute="Normal Text" context="FunctionNameStart"/>
1857       </context>
1858       <context attribute="Function" lineEndContext="#pop" name="FunctionNameStart" fallthroughContext="#pop!FunctionName">
1859         <AnyChar context="#pop#pop" String="&symbolseps;#" lookAhead="1"/>
1860         <DetectChar context="FunctionNameStartMaybeBraceExpansion" char="{" lookAhead="1"/>
1861       </context>
1862       <context attribute="Function" lineEndContext="#pop" name="FunctionName">
1863         <AnyChar context="#pop" String=" &tab;(" lookAhead="1"/>
1864         <IncludeRules context="FindWord"/>
1865         <DetectChar context="FunctionNameMaybeBraceExpansion" char="{" lookAhead="1"/>
1866         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
1867         <DetectIdentifier attribute="Function"/>
1868       </context>
1869       <context attribute="Function" lineEndContext="#pop" name="FunctionNameRecBrace" fallthroughContext="#pop">
1870         <IncludeRules context="FindWord"/>
1871         <DetectChar context="FunctionNameMaybeBraceExpansion" char="{" lookAhead="1"/>
1872         <DetectChar attribute="Function" context="#pop" char="}"/>
1873         <DetectIdentifier attribute="Function"/>
1874       </context>
1875       <context attribute="Function" lineEndContext="#pop" name="FunctionNameStartMaybeBraceExpansion">
1876         <IncludeRules context="DispatchBraceExpansion"/>
1877         <DetectChar attribute="Keyword" context="#pop#pop#pop!Group" char="{" beginRegion="group"/>
1878       </context>
1879       <context attribute="Function" lineEndContext="#pop" name="FunctionNameMaybeBraceExpansion">
1880         <IncludeRules context="DispatchBraceExpansion"/>
1881         <DetectChar attribute="Function" context="#pop!FunctionNameRecBrace" char="{" beginRegion="group"/>
1882       </context>
1883 
1884       <!-- Case is called after the case keyword is encoutered. We handle this because of
1885            the lonely closing parentheses that would otherwise disturb the expr matching -->
1886       <context attribute="Normal Text" lineEndContext="#stay" name="Case">
1887         <DetectSpaces attribute="Normal Text" context="#stay"/>
1888         <DetectChar attribute="Keyword" context="#pop!CaseAlt" char="{"/>
1889         <WordDetect attribute="Keyword" context="#pop!CaseIn" String="in"/>
1890         <IncludeRules context="FindWord"/>
1891         <DetectIdentifier attribute="Normal Text" context="#stay"/>
1892       </context>
1893 
1894       <!-- CaseIn is called when the construct 'case ... in' has been found. -->
1895       <context attribute="Normal Text" lineEndContext="#stay" name="CaseIn" fallthroughContext="CasePattern">
1896         <DetectSpaces attribute="Normal Text" context="#stay"/>
1897         <DetectChar attribute="Keyword" context="CaseClosedPattern" char="("/>
1898         <DetectChar attribute="Comment" context="Comment" char="#"/>
1899       </context>
1900       <context attribute="Pattern" lineEndContext="#stay" name="CasePattern">
1901         <WordDetect attribute="Control Flow" context="#pop#pop" String="esac" endRegion="case"/>
1902         <IncludeRules context="CaseClosedPattern"/>
1903       </context>
1904       <context attribute="Pattern" lineEndContext="#stay" name="CaseClosedPattern">
1905         <DetectSpaces attribute="Normal Text" context="#stay"/>
1906         <DetectChar attribute="Keyword" context="#pop!CaseExpr" char=")" beginRegion="caseexpr"/>
1907         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1908         <DetectChar attribute="Keyword" context="#stay" char="|"/>
1909         <IncludeRules context="FindWord"/>
1910         <IncludeRules context="FindPattern"/>
1911         <DetectIdentifier attribute="Pattern" context="#stay"/>
1912       </context>
1913 
1914       <context attribute="Normal Text" lineEndContext="#stay" name="CaseAlt" fallthroughContext="CasePattern">
1915         <DetectSpaces attribute="Normal Text" context="#stay"/>
1916         <DetectChar attribute="Keyword" context="CasePattern" char="("/>
1917         <DetectChar attribute="Keyword" context="#pop!CaseAltEnd" char="}" endRegion="caseexpr" lookAhead="1"/>
1918       </context>
1919       <context attribute="Normal Text" lineEndContext="#stay" name="CaseAltEnd">
1920         <DetectChar attribute="Keyword" context="#pop" char="}" endRegion="case"/>
1921       </context>
1922 
1923       <!-- CaseExpr eats shell input till ;; / ;& / ;| -->
1924       <context attribute="Normal Text" lineEndContext="#stay" name="CaseExpr" fallthroughContext="Command">
1925         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1="|" endRegion="caseexpr"/>
1926         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1=";" endRegion="caseexpr"/>
1927         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1="&amp;" endRegion="caseexpr"/>
1928         <WordDetect context="#pop" String="esac" endRegion="caseexpr" lookAhead="1"/>
1929         <DetectChar context="#pop" char="}" lookAhead="1"/>
1930         <IncludeRules context="Start"/>
1931       </context>
1932 
1933       <!-- ExprGlobParen is called after a ( is encountered in a argument -->
1934       <context attribute="Glob Flag" lineEndContext="#pop" name="ExprGlobParen" fallthroughContext="#pop">
1935         <Detect2Chars attribute="Glob Flag" context="#pop!GlobPatFlag" char="(" char1="#"/>
1936         <RegExpr attribute="Glob" context="#pop!ExtGlobPattern" String="\((?=&ispattern;)"/>
1937         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier" char="("/>
1938       </context>
1939       <context attribute="Glob Flag" lineEndContext="#pop" name="ExprGlobParenThenPath" fallthroughContext="#pop">
1940         <Detect2Chars attribute="Glob Flag" context="#pop!GlobPatFlagThenPath" char="(" char1="#"/>
1941         <RegExpr attribute="Glob" context="#pop!ExtGlobPatternThenPath" String="\((?=&ispattern;)"/>
1942         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier" char="("/>
1943       </context>
1944       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier">
1945         <AnyChar attribute="Glob Flag" context="#stay" String="/F.@=p*%bcrwxAIERWXsStUG^-MTNDn"/>
1946         <AnyChar attribute="Glob Flag" context="GlobQualifier_e" String="eP"/>
1947         <AnyChar attribute="Glob Flag" context="GlobQualifier_u" String="ug"/>
1948         <AnyChar attribute="Glob Flag" context="GlobQualifier_a" String="amc"/>
1949         <AnyChar attribute="Glob Flag" context="GlobQualifier_o" String="oO"/>
1950         <DetectChar attribute="Glob Flag" context="GlobQualifier_f" char="f"/>
1951         <DetectChar attribute="Glob Flag" context="GlobQualifier_+" char="+"/>
1952         <DetectChar attribute="Glob Flag" context="GlobQualifier_d" char="d"/>
1953         <DetectChar attribute="Glob Flag" context="GlobQualifier_L" char="L"/>
1954         <DetectChar attribute="Glob Flag" context="GlobQualifier_Y" char="Y"/>
1955         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1956 
1957         <DetectChar attribute="Operator" context="#stay" char=","/>
1958         <DetectChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier" char=":"/>
1959         <DetectChar attribute="Glob Flag" context="#pop" char=")"/>
1960         <IncludeRules context="FindWord"/>
1961       </context>
1962 
1963       <context attribute="Normal Text" lineEndContext="#pop" name="GlobQualifier_o" fallthroughContext="#pop">
1964         <AnyChar attribute="Normal Text" context="#stay" String="nLlamcdN"/>
1965       </context>
1966 
1967       <context attribute="Number" lineEndContext="#pop" name="GlobQualifier_Y" fallthroughContext="#pop">
1968         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
1969       </context>
1970 
1971       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_L" fallthroughContext="#pop">
1972         <AnyChar attribute="Normal Text" context="#stay" String="kKmMpPgGtT"/>
1973         <AnyChar attribute="Number" context="#pop!GlobQualifier_Y" String="-+0123456789"/>
1974       </context>
1975 
1976       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_a" fallthroughContext="#pop">
1977         <AnyChar attribute="Normal Text" context="#stay" String="Mwhmsd"/>
1978         <AnyChar attribute="Number" context="#pop!GlobQualifier_Y" String="-+0123456789"/>
1979       </context>
1980 
1981       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_+" fallthroughContext="#pop">
1982         <RegExpr attribute="Function" context="#pop" String="[^&_fragpathseps;=,\[]+"/>
1983       </context>
1984 
1985       <context attribute="Path" lineEndContext="#pop" name="GlobQualifier_d">
1986         <AnyChar context="#pop" String=")," lookAhead="1"/>
1987       </context>
1988 
1989       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_u">
1990         <AnyChar attribute="Number" context="#pop!GlobQualifier_Y" String="0123456789"/>
1991         <IncludeRules context="GlobQualifier_e"/>
1992       </context>
1993 
1994       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_f" fallthroughContext="#pop">
1995         <AnyChar attribute="Number" context="#pop!GlobQualifier_fo" String="0123456789=+-"/>
1996         <DetectChar attribute="Glob" context="#pop!GlobQualifier_fo" char="?"/>
1997         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_f[" char="["/>
1998         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_f&lt;" char="&lt;"/>
1999         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_f{" char="{"/>
2000         <RegExpr attribute="Glob Flag" context="#pop!GlobQualifier_fx" String="(.)"/>
2001       </context>
2002       <context attribute="Number" lineEndContext="#pop" name="GlobQualifier_fo" fallthroughContext="#pop">
2003         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
2004         <DetectChar attribute="Glob" context="#stay" char="?"/>
2005       </context>
2006       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_f[">
2007         <DetectChar attribute="Operator" context="#stay" char=","/>
2008         <DetectChar attribute="Glob Flag" context="#pop" char="]"/>
2009       </context>
2010       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_f&lt;">
2011         <DetectChar attribute="Operator" context="#stay" char=","/>
2012         <DetectChar attribute="Glob Flag" context="#pop" char=">"/>
2013       </context>
2014       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_f{">
2015         <DetectChar attribute="Operator" context="#stay" char=","/>
2016         <DetectChar attribute="Glob Flag" context="#pop" char="}"/>
2017       </context>
2018       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_fx">
2019         <DetectChar attribute="Operator" context="#stay" char=","/>
2020         <DetectChar attribute="Glob Flag" context="#pop" char="1" dynamic="1"/>
2021       </context>
2022 
2023       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_e" fallthroughContext="#pop">
2024         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_e[" char="["/>
2025         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_e&lt;" char="&lt;"/>
2026         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_e{" char="{"/>
2027         <RegExpr attribute="Glob Flag" context="#pop!GlobQualifier_ex" String="(.)"/>
2028       </context>
2029       <context attribute="Normal Text" lineEndContext="#stay" name="IncGlobQualifier_e">
2030         <IncludeRules context="FindStrings"/>
2031         <DetectChar context="RegularVariable" char="$" lookAhead="1"/>
2032         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
2033       </context>
2034       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_e[">
2035         <DetectChar attribute="Glob Flag" context="#pop" char="]"/>
2036         <IncludeRules context="IncGlobQualifier_e"/>
2037       </context>
2038       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_e&lt;">
2039         <DetectChar attribute="Glob Flag" context="#pop" char=">"/>
2040         <IncludeRules context="IncGlobQualifier_e"/>
2041       </context>
2042       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_e{">
2043         <DetectChar attribute="Glob Flag" context="#pop" char="}"/>
2044         <IncludeRules context="IncGlobQualifier_e"/>
2045       </context>
2046       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_ex">
2047         <DetectChar attribute="Glob Flag" context="#pop" char="1" dynamic="1"/>
2048         <IncludeRules context="IncGlobQualifier_e"/>
2049       </context>
2050 
2051       <!-- GlobPatFlag is called after a (# is encountered -->
2052       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobPatFlag" fallthroughContext="#pop">
2053         <IncludeRules context="IncGlobPatFlag"/>
2054         <DetectChar attribute="Glob Flag" context="#pop" char=")"/>
2055       </context>
2056       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobPatFlagThenPath" fallthroughContext="#pop">
2057         <IncludeRules context="IncGlobPatFlag"/>
2058         <DetectChar attribute="Glob Flag" context="#pop!PathThenPop" char=")"/>
2059       </context>
2060       <context attribute="Glob Flag" lineEndContext="#pop" name="IncGlobPatFlag" fallthroughContext="#pop">
2061         <AnyChar attribute="Glob Flag" context="#stay" String="ilIbBcmMaseuU,"/>
2062         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
2063         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier" char="q"/>
2064       </context>
2065 
2066       <!-- GlobModifier is called after a : is encountered in a GlobQualifier -->
2067       <context attribute="Parameter Expansion" lineEndContext="#pop" name="GlobModifier">
2068         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
2069         <AnyChar attribute="Parameter Expansion" context="VarBraceModifier_h" String="ht"/>
2070         <DetectChar attribute="Parameter Expansion" context="GlobModifier_s" char="s"/>
2071         <Detect2Chars attribute="Parameter Expansion" context="GlobModifier_s" char="g" char1="s"/>
2072         <DetectChar attribute="Glob Flag" context="#pop" char=")"/>
2073       </context>
2074       <context attribute="Parameter Expansion" lineEndContext="#stay" name="GlobModifier_s" fallthroughContext="#pop">
2075         <DetectChar attribute="Error" context="#pop#pop" char=")"/>
2076         <DetectChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_PatPrefix" char="/"/>
2077       </context>
2078       <context attribute="Pattern" lineEndContext="#stay" name="GlobModifier_s_PatPrefix" fallthroughContext="#pop!GlobModifier_s_Pat">
2079         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_Pat" char="#" char1="%"/>
2080         <AnyChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_Pat" String="#%"/>
2081       </context>
2082       <context attribute="Pattern" lineEndContext="#stay" name="GlobModifier_s_Pat">
2083         <DetectChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_Rep" char="/"/>
2084         <IncludeRules context="FindWord"/>
2085         <IncludeRules context="FindSubPattern"/>
2086         <DetectChar attribute="Error" context="#pop#pop" char=")"/>
2087         <DetectIdentifier attribute="Pattern"/>
2088       </context>
2089       <context attribute="String DoubleQ" lineEndContext="#stay" name="GlobModifier_s_Rep">
2090         <DetectChar attribute="Glob Flag" context="#pop#pop" char=")"/>
2091         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="/"/>
2092         <DetectChar attribute="String DoubleQ" context="GlobModifier_s_RecursiveRep" char="("/>
2093         <IncludeRules context="FindWord"/>
2094         <DetectIdentifier attribute="String DoubleQ"/>
2095       </context>
2096       <context attribute="String DoubleQ" lineEndContext="#stay" name="GlobModifier_s_RecursiveRep">
2097         <DetectChar attribute="String DoubleQ" context="#pop" char=")"/>
2098         <DetectChar attribute="String DoubleQ" context="GlobModifier_s_RecursiveRep" char="("/>
2099         <IncludeRules context="FindWord"/>
2100         <DetectIdentifier attribute="String DoubleQ"/>
2101       </context>
2102 
2103     </contexts>
2104 
2105     <itemDatas>
2106       <itemData name="Normal Text"    defStyleNum="dsNormal"/>
2107       <itemData name="Comment"        defStyleNum="dsComment"/>
2108       <itemData name="Keyword"        defStyleNum="dsKeyword"       spellChecking="false"/>
2109       <itemData name="Control"        defStyleNum="dsKeyword"       spellChecking="false"/>
2110       <itemData name="Control Flow"   defStyleNum="dsControlFlow"   spellChecking="false"/>
2111       <itemData name="Builtin"        defStyleNum="dsBuiltIn"       spellChecking="false"/>
2112       <itemData name="Command"        defStyleNum="dsFunction"      spellChecking="false"/>
2113       <itemData name="OtherCommand"   defStyleNum="dsExtension"     spellChecking="false"/>
2114       <itemData name="Redirection"    defStyleNum="dsOperator"      spellChecking="false"/>
2115       <itemData name="Escape"         defStyleNum="dsDataType"      spellChecking="false"/>
2116       <itemData name="String SingleQ" defStyleNum="dsString"/>
2117       <itemData name="String DoubleQ" defStyleNum="dsString"/>
2118       <itemData name="Here Doc"       defStyleNum="dsString"/>
2119       <itemData name="Backquote"      defStyleNum="dsKeyword"       spellChecking="false"/>
2120       <itemData name="String Transl." defStyleNum="dsString"/>
2121       <itemData name="String Escape"  defStyleNum="dsDataType"/>
2122       <itemData name="Variable"       defStyleNum="dsVariable"      spellChecking="false"/>
2123       <itemData name="Dollar Prefix"  defStyleNum="dsVariable"      spellChecking="false"/>
2124       <itemData name="Expression"     defStyleNum="dsOthers"        spellChecking="false"/>
2125       <itemData name="Function"       defStyleNum="dsFunction"      spellChecking="false"/>
2126       <itemData name="Pattern"        defStyleNum="dsSpecialString" spellChecking="false"/>
2127       <itemData name="Path"           defStyleNum="dsNormal"        spellChecking="false"/>
2128       <itemData name="Glob"           defStyleNum="dsPreprocessor"  spellChecking="false"/>
2129       <itemData name="Glob Flag"      defStyleNum="dsOperator"      spellChecking="false"/>
2130       <itemData name="Option"         defStyleNum="dsAttribute"     spellChecking="false"/>
2131       <itemData name="Hex"            defStyleNum="dsBaseN"         spellChecking="false"/>
2132       <itemData name="Number"         defStyleNum="dsDecVal"        spellChecking="false"/>
2133       <itemData name="Base"           defStyleNum="dsDataType"      spellChecking="false"/>
2134       <itemData name="BaseN"          defStyleNum="dsBaseN"         spellChecking="false"/>
2135       <itemData name="File Descriptor" defStyleNum="dsDecVal"       spellChecking="false"/>
2136       <itemData name="Parameter Expansion" defStyleNum="dsVariable" spellChecking="false"/>
2137       <itemData name="Parameter Expansion Operator" defStyleNum="dsOperator" spellChecking="false"/>
2138       <itemData name="Operator"       defStyleNum="dsOperator"      spellChecking="false"/>
2139       <itemData name="Error"          defStyleNum="dsError"         spellChecking="false"/>
2140     </itemDatas>
2141   </highlighting>
2142   <general>
2143     <comments>
2144       <comment name="singleLine" start="#"/>
2145     </comments>
2146     <keywords casesensitive="1" weakDeliminator="^%#[]$._:-/" additionalDeliminator="`"/>
2147   </general>
2148 </language>
2149 <!-- kate: replace-tabs on; indent-width 2; -->