Warning, /frameworks/syntax-highlighting/data/syntax/bash.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;}=#$]|[+!@](?!\())([^&_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;;()"> <!-- see man bash -->
0012     <!ENTITY wordseps   " &tab;&symbolseps;"> <!-- see man bash -->
0013 
0014     <!ENTITY bq_string  "`[^`]*+`">
0015     <!ENTITY sq_string  "'[^']*+'">
0016     <!ENTITY dq_string  "&quot;(?:[^&quot;\\`]*+|&bq_string;|\\.)*+&quot;">
0017     <!ENTITY strings    "(?:&sq_string;|&dq_string;|&bq_string;)">
0018 
0019     <!ENTITY globany    "\[(?:[^&wordseps;&quot;'`\\\[\]]+|\\.|&strings;|\[:\w+:\]|\[)*\]">
0020 
0021     <!ENTITY next_is_globany    "(?:\^?\]\]|(?:\^?\]?)?(?:\\.|[^'&quot; &tab;&lt;>|&amp;;()\\[\]]+|&strings;|\[:\w+:\])+\])">
0022     <!ENTITY bracket_noglobany  "\[(?!&next_is_globany;)">
0023 
0024     <!ENTITY _fragpathseps  "*?+!@&wordseps;&substseps;">
0025     <!ENTITY _fragpathnosep "(?:[+!@](?!\()|\\.|&_brace_noexpansion;)?+">
0026     <!ENTITY path       "(?:[^&_fragpathseps;\[]*+&_fragpathnosep;)*+">
0027     <!ENTITY fragpath   "(?:[^&_fragpathseps;\[/]*+&_fragpathnosep;)*+">
0028     <!ENTITY opt        "(?:[^&_fragpathseps;\[=/]*+&_fragpathnosep;)*+">
0029     <!ENTITY pathpart   "(?:~|\.\.?|&fragpath;)(?:/&path;|(?=[*?]|[+!@]\(|&fragpath;(?:[/*?]|\[&next_is_globany;|[+!@]\()))|(?:~|\.\.?)(?=[&wordseps;]|$)">
0030 
0031     <!ENTITY _fragpathseps_alt  "*?+!@&substseps;}">
0032     <!ENTITY _fragpathnosep_alt "(?:[+!@](?!\()|\\.)?+">
0033     <!ENTITY path_alt       "(?:[^&_fragpathseps_alt;]*+&_fragpathnosep_alt;)*+">
0034     <!ENTITY fragpath_alt   "(?:[^&_fragpathseps_alt;/]*+&_fragpathnosep_alt;)*+">
0035     <!ENTITY opt_alt        "(?:[^&_fragpathseps_alt;=/]*+&_fragpathnosep_alt;)*+">
0036     <!ENTITY pathpart_alt   "(?:~|\.\.?|&fragpath_alt;)(?:/&path_alt;|(?=[*?]|[+!@]\(|&fragpath_alt;(?:[/*?]|[+!@]\()))|(?:~|\.\.?)(?=\}|$)">
0037 
0038     <!-- Path only with / -->
0039     <!ENTITY path_with_sep_text  "[^?*+!@&wordseps;'&quot;`\\/]">
0040     <!ENTITY path_with_sep_text2 "[^?*+!@()'&quot;`\\/]">
0041     <!ENTITY path_with_sep_expr  "\\.|&strings;|&globany;|[?*+](?!\()">
0042     <!ENTITY path_with_sep_spe   "(~|\.\.?)($|[/ &tab;&lt;>|&amp;;)])">
0043     <!ENTITY path_with_sep_sub   "[?*+!@]\((&path_with_sep_text2;++|&path_with_sep_expr;)*+(\)|(?=/))">
0044     <!ENTITY path_with_sep "/|&path_with_sep_spe;|(&path_with_sep_text;++|&path_with_sep_expr;|&path_with_sep_sub;)*+/">
0045 
0046     <!ENTITY _braceexpansion_spe     " &tab;&lt;>|&amp;;{}\\`'&quot;$">
0047     <!ENTITY _brace_noexpansion       "\{[^&_braceexpansion_spe;,]*+\}">
0048     <!ENTITY _braceexpansion_var     "\$(?:\{[^\[\]&_braceexpansion_spe;]*+(?:\[[*@a-zA-Z0-9]\])\})?">
0049     <!ENTITY _braceexpansion_string  "'[^']*'|&quot;([^&quot;\`]*+|`[^`]*`)*+&quot;">
0050     <!ENTITY _braceexpansion_elems   "\\.|`[^`]*`|&_braceexpansion_string;|&_braceexpansion_var;|&_brace_noexpansion;">
0051     <!ENTITY _braceexpansion_consume "&_braceexpansion_elems;|{(?:[^&_braceexpansion_spe;,]++|&_braceexpansion_elems;)*?}|(?R)?+">
0052     <!ENTITY _braceexpansion "(?:[^&_braceexpansion_spe;,]++|&_braceexpansion_consume;)*?,(?:[^&_braceexpansion_spe;]++|&_braceexpansion_consume;)*?}">
0053     <!ENTITY braceexpansion "{&_braceexpansion;">
0054 
0055     <!ENTITY heredocq "(?|&quot;([^&quot;]+)&quot;|'([^']+)'|\\(.[^&wordseps;&substseps;]*))">
0056 
0057     <!ENTITY arithmetic_as_subshell "\(((?:[^`'&quot;()$]++|\$\{[^`'&quot;(){}$]+\}|\$(?=[^{`'&quot;()])|`[^`]*+`|\((?1)(?:[)]|(?=['&quot;])))++)(?:[)](?=$|[^)])|[&quot;'])">
0058 
0059     <!ENTITY unary_operators  "-[abcdefghkprstuwxGLNOSovRnz]&eos;">
0060     <!ENTITY binary_operators "(?:-(?:e[fq]|[nolg]t|[nlg]e)|==?|!=)&eos;">
0061 
0062     <!ENTITY dblbracket_close "\]\](?=($|[ &tab;;|&amp;)]))">
0063 
0064     <!ENTITY weakDeliminatorSymbols "^&#37;#[]$.{}:-/">
0065 ]>
0066 
0067 <language
0068     name="Bash"
0069     version="51"
0070     kateversion="5.79"
0071     section="Scripts"
0072     extensions="*.sh;*.bash;*.ebuild;*.eclass;*.exlib;*.exheres-0;.bashrc;.bash_profile;.bash_login;.profile;PKGBUILD;APKBUILD"
0073     mimetype="application/x-shellscript"
0074     casesensitive="1"
0075     author="Wilbert Berendsen (wilbert@kde.nl)"
0076     license="LGPL"
0077   >
0078 
0079 <!-- (c) 2004 by Wilbert Berendsen (wilbert@kde.nl)
0080     Changes by Matthew Woehlke (mw_triad@users.sourceforge.net)
0081     Changes by Sebastian Pipping (webmaster@hartwork.org)
0082     Changes by Luiz Angelo Daros de Luca (luizluca@gmail.com)
0083     Released under the LGPL, part of kdelibs/kate -->
0084 
0085   <highlighting>
0086     <list name="keywords">
0087       <item>break</item>
0088       <item>case</item>
0089       <item>continue</item>
0090       <item>do</item>
0091       <item>done</item>
0092       <item>elif</item>
0093       <item>else</item>
0094       <item>esac</item>
0095       <item>fi</item>
0096       <item>for</item>
0097       <item>function</item>
0098       <item>if</item>
0099       <item>in</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">
0108       <item>.</item>
0109       <item>:</item>
0110       <item>source</item>
0111       <item>alias</item>
0112       <item>bg</item>
0113       <item>bind</item>
0114       <item>builtin</item>
0115       <item>cd</item>
0116       <item>caller</item>
0117       <item>command</item>
0118       <item>compgen</item>
0119       <item>complete</item>
0120       <item>coproc</item>
0121       <item>dirs</item>
0122       <item>disown</item>
0123       <item>echo</item>
0124       <item>enable</item>
0125       <item>eval</item>
0126       <item>exec</item>
0127       <item>exit</item>
0128       <item>fc</item>
0129       <item>fg</item>
0130       <item>hash</item>
0131       <item>help</item>
0132       <item>history</item>
0133       <item>jobs</item>
0134       <item>kill</item>
0135       <item>logout</item>
0136       <item>popd</item>
0137       <item>printf</item>
0138       <item>pushd</item>
0139       <item>pwd</item>
0140       <item>set</item>
0141       <item>shift</item>
0142       <item>shopt</item>
0143       <item>suspend</item>
0144       <item>test</item>
0145       <item>time</item>
0146       <item>times</item>
0147       <item>trap</item>
0148       <item>type</item>
0149       <item>ulimit</item>
0150       <item>umask</item>
0151       <item>unalias</item>
0152       <item>wait</item>
0153     </list>
0154 
0155     <list name="builtins_var">
0156       <item>export</item>
0157       <item>declare</item>
0158       <item>getopts</item>
0159       <item>let</item>
0160       <item>local</item>
0161       <item>read</item>
0162       <item>readonly</item>
0163       <item>typeset</item>
0164       <item>unset</item>
0165     </list>
0166 
0167     <list name="unixcommands">
0168       <!-- /bin -->
0169       <item>arch</item>
0170       <item>awk</item>
0171       <item>b2sum</item>
0172       <item>base32</item>
0173       <item>base64</item>
0174       <item>bash</item>
0175       <item>bunzip2</item>
0176       <item>bzcat</item>
0177       <item>bzcmp</item>
0178       <item>bzdiff</item>
0179       <item>bzegrep</item>
0180       <item>bzfgrep</item>
0181       <item>bzgrep</item>
0182       <item>bzip2</item>
0183       <item>bzip2recover</item>
0184       <item>bzless</item>
0185       <item>bzmore</item>
0186       <item>cat</item>
0187       <item>chattr</item>
0188       <item>chcon</item>
0189       <item>chgrp</item>
0190       <item>chmod</item>
0191       <item>chown</item>
0192       <item>chvt</item>
0193       <item>cksum</item>
0194       <item>cp</item>
0195       <item>crontab</item>
0196       <item>csplit</item>
0197       <item>date</item>
0198       <item>dd</item>
0199       <item>deallocvt</item>
0200       <item>df</item>
0201       <item>dir</item>
0202       <item>dircolors</item>
0203       <item>dmesg</item>
0204       <item>dnsdomainname</item>
0205       <item>domainname</item>
0206       <item>du</item>
0207       <item>dumpkeys</item>
0208       <item>ed</item>
0209       <item>egrep</item>
0210       <item>expand</item>
0211       <item>false</item>
0212       <item>fgconsole</item>
0213       <item>fgrep</item>
0214       <item>fold</item>
0215       <item>fuser</item>
0216       <item>gawk</item>
0217       <item>getkeycodes</item>
0218       <item>gocr</item>
0219       <item>grep</item>
0220       <item>groff</item>
0221       <item>groups</item>
0222       <item>gunzip</item>
0223       <item>gzexe</item>
0224       <item>gzip</item>
0225       <item>hostid</item>
0226       <item>hostname</item>
0227       <item>iconv</item>
0228       <item>igawk</item>
0229       <item>install</item>
0230       <item>kbd_mode</item>
0231       <item>kbdrate</item>
0232       <item>killall</item>
0233       <item>last</item>
0234       <item>lastb</item>
0235       <item>link</item>
0236       <item>ln</item>
0237       <item>loadkeys</item>
0238       <item>loadunimap</item>
0239       <item>login</item>
0240       <item>ls</item>
0241       <item>lsattr</item>
0242       <item>lsmod</item>
0243       <item>lsmod.old</item>
0244       <item>lzcat</item>
0245       <item>lzcmp</item>
0246       <item>lzdiff</item>
0247       <item>lzegrep</item>
0248       <item>lzfgrep</item>
0249       <item>lzgrep</item>
0250       <item>lzless</item>
0251       <item>lzma</item>
0252       <item>lzmainfo</item>
0253       <item>lzmore</item>
0254       <item>mapscrn</item>
0255       <item>md5sum</item>
0256       <item>mesg</item>
0257       <item>mkdir</item>
0258       <item>mkfifo</item>
0259       <item>mknod</item>
0260       <item>mktemp</item>
0261       <item>more</item>
0262       <item>mount</item>
0263       <item>mv</item>
0264       <item>nano</item>
0265       <item>netstat</item>
0266       <item>nisdomainname</item>
0267       <item>nproc</item>
0268       <item>nroff</item>
0269       <item>numfmt</item>
0270       <item>openvt</item>
0271       <item>paste</item>
0272       <item>pathchk</item>
0273       <item>pgawk</item>
0274       <item>pidof</item>
0275       <item>ping</item>
0276       <item>pinky</item>
0277       <item>printenv</item>
0278       <item>ps</item>
0279       <item>pstree</item>
0280       <item>ptx</item>
0281       <item>rbash</item>
0282       <item>readlink</item>
0283       <item>realpath</item>
0284       <item>red</item>
0285       <item>resizecons</item>
0286       <item>rm</item>
0287       <item>rmdir</item>
0288       <item>run-parts</item>
0289       <item>runcon</item>
0290       <item>sash</item>
0291       <item>sed</item>
0292       <item>setfont</item>
0293       <item>setkeycodes</item>
0294       <item>setleds</item>
0295       <item>setmetamode</item>
0296       <item>setserial</item>
0297       <item>sh</item>
0298       <item>sha1sum</item>
0299       <item>sha224sum</item>
0300       <item>sha256sum</item>
0301       <item>sha384sum</item>
0302       <item>sha512sum</item>
0303       <item>showkey</item>
0304       <item>shred</item>
0305       <item>shuf</item>
0306       <item>sleep</item>
0307       <item>ssed</item>
0308       <item>stat</item>
0309       <item>stdbuf</item>
0310       <item>stty</item>
0311       <item>su</item>
0312       <item>sync</item>
0313       <item>tar</item>
0314       <item>tempfile</item>
0315       <item>timeout</item>
0316       <item>touch</item>
0317       <item>tput</item>
0318       <item>troff</item>
0319       <item>true</item>
0320       <item>truncate</item>
0321       <item>tty</item>
0322       <item>umount</item>
0323       <item>uname</item>
0324       <item>unexpand</item>
0325       <item>unicode_start</item>
0326       <item>unicode_stop</item>
0327       <item>unlink</item>
0328       <item>unlzma</item>
0329       <item>unxz</item>
0330       <item>utmpdump</item>
0331       <item>uuidgen</item>
0332       <item>vdir</item>
0333       <item>vi</item>
0334       <item>wall</item>
0335       <item>wc</item>
0336       <item>xz</item>
0337       <item>xzcat</item>
0338       <item>ypdomainname</item>
0339       <item>zcat</item>
0340       <item>zcmp</item>
0341       <item>zdiff</item>
0342       <item>zegrep</item>
0343       <item>zfgrep</item>
0344       <item>zforce</item>
0345       <item>zgrep</item>
0346       <item>zless</item>
0347       <item>zmore</item>
0348       <item>znew</item>
0349       <item>zsh</item>
0350 
0351       <!-- some from /usr/bin -->
0352       <item>aclocal</item>
0353       <item>aconnect</item>
0354       <item>aplay</item>
0355       <item>apm</item>
0356       <item>apmsleep</item>
0357       <item>apropos</item>
0358       <item>ar</item>
0359       <item>arecord</item>
0360       <item>as</item>
0361       <item>as86</item>
0362       <item>autoconf</item>
0363       <item>autoheader</item>
0364       <item>automake</item>
0365       <item>basename</item>
0366       <item>bc</item>
0367       <item>bison</item>
0368       <item>c++</item>
0369       <item>cal</item>
0370       <item>cc</item>
0371       <item>cdda2wav</item>
0372       <item>cdparanoia</item>
0373       <item>cdrdao</item>
0374       <item>cd-read</item>
0375       <item>cdrecord</item>
0376       <item>chfn</item>
0377       <item>chroot</item>
0378       <item>chsh</item>
0379       <item>clear</item>
0380       <item>cmp</item>
0381       <item>co</item>
0382       <item>col</item>
0383       <item>comm</item>
0384       <item>cpio</item>
0385       <item>cpp</item>
0386       <item>cut</item>
0387       <item>dc</item>
0388       <item>diff</item>
0389       <item>diff3</item>
0390       <item>directomatic</item>
0391       <item>dirname</item>
0392       <item>env</item>
0393       <item>expr</item>
0394       <item>fbset</item>
0395       <item>file</item>
0396       <item>find</item>
0397       <item>flex</item>
0398       <item>flex++</item>
0399       <item>fmt</item>
0400       <item>free</item>
0401       <item>ftp</item>
0402       <item>funzip</item>
0403       <item>g++</item>
0404       <item>gc</item>
0405       <item>gcc</item>
0406       <item>clang</item>
0407       <item>clang++</item>
0408       <item>valgrind</item>
0409       <item>xdg-open</item>
0410       <item>cmake</item>
0411       <item>qmake</item>
0412       <item>svn</item>
0413       <item>git</item>
0414       <item>rsync</item>
0415       <item>gdb</item>
0416       <item>getent</item>
0417       <item>getopt</item>
0418       <item>gettext</item>
0419       <item>gettextize</item>
0420       <item>gimp</item>
0421       <item>gimp-remote</item>
0422       <item>gimptool</item>
0423       <item>gmake</item>
0424       <item>gs</item>
0425       <item>head</item>
0426       <item>hexdump</item>
0427       <item>id</item>
0428       <item>join</item>
0429       <item>ld</item>
0430       <item>ld86</item>
0431       <item>ldd</item>
0432       <item>less</item>
0433       <item>lex</item>
0434       <item>locate</item>
0435       <item>lockfile</item>
0436       <item>logname</item>
0437       <item>lp</item>
0438       <item>lpr</item>
0439       <item>lynx</item>
0440       <item>m4</item>
0441       <item>make</item>
0442       <item>man</item>
0443       <item>msgfmt</item>
0444       <item>namei</item>
0445       <item>nasm</item>
0446       <item>nawk</item>
0447       <item>nice</item>
0448       <item>nl</item>
0449       <item>nm</item>
0450       <item>nm86</item>
0451       <item>nmap</item>
0452       <item>nohup</item>
0453       <item>nop</item>
0454       <item>od</item>
0455       <item>passwd</item>
0456       <item>patch</item>
0457       <item>pcregrep</item>
0458       <item>pcretest</item>
0459       <item>perl</item>
0460       <item>perror</item>
0461       <item>pr</item>
0462       <item>procmail</item>
0463       <item>prune</item>
0464       <item>ps2ascii</item>
0465       <item>ps2epsi</item>
0466       <item>ps2frag</item>
0467       <item>ps2pdf</item>
0468       <item>ps2ps</item>
0469       <item>psbook</item>
0470       <item>psmerge</item>
0471       <item>psnup</item>
0472       <item>psresize</item>
0473       <item>psselect</item>
0474       <item>pstops</item>
0475       <item>rcs</item>
0476       <item>rev</item>
0477       <item>scp</item>
0478       <item>seq</item>
0479       <item>setterm</item>
0480       <item>size</item>
0481       <item>size86</item>
0482       <item>skill</item>
0483       <item>slogin</item>
0484       <item>snice</item>
0485       <item>sort</item>
0486       <item>sox</item>
0487       <item>split</item>
0488       <item>ssh</item>
0489       <item>ssh-add</item>
0490       <item>ssh-agent</item>
0491       <item>ssh-keygen</item>
0492       <item>ssh-keyscan</item>
0493       <item>strings</item>
0494       <item>strip</item>
0495       <item>sudo</item>
0496       <item>suidperl</item>
0497       <item>sum</item>
0498       <item>tac</item>
0499       <item>tail</item>
0500       <item>tee</item>
0501       <item>tr</item>
0502       <item>tsort</item>
0503       <item>uniq</item>
0504       <item>unzip</item>
0505       <item>updatedb</item>
0506       <item>updmap</item>
0507       <item>uptime</item>
0508       <item>users</item>
0509       <item>vmstat</item>
0510       <item>w</item>
0511       <item>wget</item>
0512       <item>whatis</item>
0513       <item>whereis</item>
0514       <item>which</item>
0515       <item>who</item>
0516       <item>whoami</item>
0517       <item>write</item>
0518       <item>xargs</item>
0519       <item>yacc</item>
0520       <item>yes</item>
0521       <item>zip</item>
0522       <item>zsoelim</item>
0523 
0524       <!-- others -->
0525       <item>dcop</item>
0526       <item>kdialog</item>
0527       <item>kfile</item>
0528       <item>xhost</item>
0529       <item>xmodmap</item>
0530       <item>xset</item>
0531     </list>
0532 
0533 
0534     <contexts>
0535       <context attribute="Normal Text" lineEndContext="#stay" name="Start" fallthroughContext="Command">
0536         <IncludeRules context="BashOneLine"/>
0537       </context>
0538 
0539       <!-- used by other syntaxes -->
0540       <context attribute="Normal Text" lineEndContext="#pop" name="FindOneLineBackq" fallthroughContext="#pop">
0541         <DetectChar attribute="Backquote" context="OneLineBackq" char="`"/>
0542       </context>
0543       <context attribute="Normal Text" lineEndContext="#stay" name="OneLineBackq" fallthroughContext="Command">
0544         <DetectChar attribute="Backquote" context="#pop" char="`"/>
0545         <IncludeRules context="Start"/>
0546       </context>
0547 
0548       <context attribute="Normal Text" lineEndContext="#pop" name="BashOneLine" fallthroughContext="Command">
0549         <DetectSpaces attribute="Normal Text" context="#stay"/>
0550         <DetectChar attribute="Comment" context="Comment" char="#"/>
0551         <!-- start expression in double parentheses -->
0552         <Detect2Chars context="ExprDblParenOrSubShell" char="(" char1="(" lookAhead="1"/>
0553         <!-- start a subshell -->
0554         <DetectChar attribute="Keyword" context="SubShell" char="(" beginRegion="subshell"/>
0555         <!-- start expression in single/double brackets -->
0556         <DetectChar context="MaybeBracketExpression" char="[" lookAhead="1"/>
0557         <!-- start a group command or BraceExpansion with { -->
0558         <DetectChar context="MaybeGroup" char="{" lookAhead="1"/>
0559 
0560         <!-- handle ` -->
0561         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0562 
0563         <!-- &> and &>> redirection -->
0564         <StringDetect attribute="Redirection" context="WordRedirection" String="&amp;>>"/>
0565         <Detect2Chars attribute="Redirection" context="FdRedirection" char="&amp;" char1=">"/>
0566 
0567         <!-- handle branche conditions -->
0568         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="&amp;"/>
0569         <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
0570 
0571         <!-- handle &, |, ; -->
0572         <AnyChar attribute="Control" context="#stay" String="&amp;|;"/>
0573 
0574         <!-- handle variable assignments -->
0575         <RegExpr attribute="Variable" context="VarAssign" String="&varname;(?=\+?=|\[(?:$|[^]]))"/>
0576         <!-- handle keywords -->
0577         <keyword context="DispatchKeyword" String="keywords" lookAhead="1"/>
0578         <!-- handle commands that have variable names as argument -->
0579         <keyword attribute="Builtin" context="VarName" String="builtins_var" lookAhead="1"/>
0580         <!-- mark function definitions without function keyword -->
0581         <RegExpr attribute="Function" context="#stay" String="&funcname;[ &tab;]*\(\)"/>
0582         <!-- Special case for `: << '#BLOCK-COMMENT' form of "multiline" comments-->
0583         <RegExpr attribute="Normal Text" context="PreHereDocMLComment" String="^:[ &tab;]+&lt;&lt;[ &tab;]*'#([^']+)'$" lookAhead="1" column="0"/>
0584         <WordDetect attribute="Builtin" context="Coproc" String="coproc"/>
0585         <keyword attribute="Builtin" context="CommandArgs" String="builtins"/>
0586         <keyword attribute="Command" context="CommandArgs" String="unixcommands"/>
0587 
0588         <!-- handle redirection -->
0589         <AnyChar context="CommandMaybeRedirection" String="&lt;&gt;0123456789" lookAhead="1"/>
0590 
0591         <AnyChar attribute="Error" context="#stay" String=")}"/>
0592 
0593         <LineContinue attribute="Escape" context="#stay"/>
0594 
0595         <Detect2Chars attribute="Expression" context="#stay" char="!" char1=" "/>
0596       </context>
0597       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeBracketExpression" fallthroughContext="#pop!Command">
0598         <!-- start expression in double brackets -->
0599         <RegExpr attribute="Keyword" context="#pop!ExprDblBracket" String="\[\[(?=$|[ &tab;(])" beginRegion="expression"/>
0600         <!-- start expression in single brackets -->
0601         <RegExpr attribute="Builtin" context="#pop!ExprBracket" String="\[&eos;" beginRegion="expression"/>
0602       </context>
0603       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeGroup">
0604         <!-- start a group command with { -->
0605         <RegExpr attribute="Keyword" context="#pop!Group" String="\{&eos;" beginRegion="group"/>
0606         <DetectChar context="#pop!Command" char="{" lookAhead="1"/>
0607       </context>
0608       <context attribute="Normal Text" lineEndContext="#pop" name="CommandMaybeRedirection" fallthroughContext="#pop!Command">
0609         <IncludeRules context="FindRedirection"/>
0610       </context>
0611       <context attribute="Normal Text" lineEndContext="#pop" name="Return" fallthroughContext="#pop">
0612         <DetectSpaces attribute="Normal Text" context="#stay"/>
0613         <Int attribute="Decimal" context="#stay"/>
0614       </context>
0615       <!-- Comment consumes shell comments till EOL -->
0616       <context attribute="Comment" lineEndContext="#pop" name="Comment">
0617         <DetectSpaces attribute="Comment"/>
0618         <IncludeRules context="##Comments"/>
0619         <DetectIdentifier attribute="Comment" context="#stay"/>
0620       </context>
0621 
0622       <!-- Group is called after a { is encountered -->
0623       <context attribute="Normal Text" lineEndContext="#stay" name="Group" fallthroughContext="Command">
0624         <DetectChar context="MaybeGroupEnd" char="}" lookAhead="1"/>
0625         <IncludeRules context="Start"/>
0626       </context>
0627       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeGroupEnd">
0628         <!-- stop a group command with } -->
0629         <RegExpr attribute="Keyword" context="#pop#pop" String="\}&eoexpr;" endRegion="group"/>
0630         <DetectChar context="#pop!Command" char="}" lookAhead="1"/>
0631       </context>
0632 
0633       <context attribute="Normal Text" lineEndContext="#pop" name="Coproc" fallthroughContext="#pop">
0634         <DetectSpaces attribute="Normal Text"/>
0635         <LineContinue attribute="Escape" context="#stay"/>
0636         <RegExpr context="CoprocName" String="(\$?&varname;|\$\{&varname;\}|'&varname;'|&quot;(\$?&varname;|\$\{&varname;\}|[a-zA-Z0-9_])+&quot;)+(?=\s+\{($|\s))" lookAhead="1"/>
0637       </context>
0638       <context attribute="Normal Text" lineEndContext="#stay" name="CoprocName">
0639         <DetectChar attribute="Keyword" context="#pop#pop!Group" char="{" beginRegion="group"/>
0640         <DetectSpaces attribute="Normal Text"/>
0641         <DetectIdentifier attribute="Normal Text"/>
0642         <IncludeRules context="FindWord"/>
0643       </context>
0644 
0645       <context attribute="Command" lineEndContext="#pop" name="Command" fallthroughContext="#pop">
0646         <DetectSpaces attribute="Normal Text" context="#pop!CommandArgs"/>
0647         <DetectChar context="CommandVariables" char="$" lookAhead="1"/>
0648         <IncludeRules context="FindStrings"/>
0649         <DetectChar context="#pop" char="`" lookAhead="1"/>
0650         <RegExpr attribute="OtherCommand" context="CommandName" String="(?:[^&wordseps;&substseps;]++|\\.)+"/>
0651         <LineContinue attribute="Escape" context="#stay"/>
0652         <DetectChar context="CommandMaybeBraceExpansion" char="{" lookAhead="1"/>
0653       </context>
0654       <context attribute="Command" lineEndContext="#pop#pop" name="CommandVariables">
0655         <IncludeRules context="DispatchVariables"/>
0656         <DetectChar attribute="OtherCommand" context="#pop" char="$"/>
0657       </context>
0658       <context attribute="Command" lineEndContext="#pop#pop" name="DispatchVariables">
0659         <IncludeRules context="DispatchSubstVariables"/>
0660         <IncludeRules context="DispatchStringVariables"/>
0661         <IncludeRules context="DispatchVarnameVariables"/>
0662       </context>
0663       <context attribute="Command" lineEndContext="#pop#pop" name="DispatchSubstVariables">
0664         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarBraceStart" char="$" char1="{"/>
0665         <StringDetect context="#pop!ExprDblParenSubstOrSubstCommand" String="$((" lookAhead="1"/>
0666         <Detect2Chars attribute="Parameter Expansion" context="#pop!SubstCommand" char="$" char1="(" beginRegion="subshell"/>
0667       </context>
0668       <context attribute="Command" lineEndContext="#pop#pop" name="DispatchStringVariables">
0669         <Detect2Chars attribute="String SingleQ" context="#pop!StringEsc" char="$" char1="'"/>
0670         <Detect2Chars attribute="String Transl." context="#pop!StringDQ" char="$" char1="&quot;"/>
0671       </context>
0672       <context attribute="Command" lineEndContext="#pop#pop" name="DispatchVarnameVariables">
0673         <RegExpr attribute="Dollar Prefix" context="#pop!VarNamePrefixedWithDollar" String="\$(?=&varname;|[*@#?$!0-9-])"/>
0674       </context>
0675       <context attribute="Variable" lineEndContext="#pop" name="VarNamePrefixedWithDollar">
0676         <DetectIdentifier attribute="Variable" context="#pop"/>
0677         <AnyChar attribute="Variable" context="#pop" String="*@#?$!0123456789-"/>
0678       </context>
0679       <context attribute="OtherCommand" lineEndContext="#pop#pop" name="CommandName">
0680         <DetectSpaces attribute="Normal Text" context="#pop#pop!CommandArgs"/>
0681         <DetectIdentifier attribute="OtherCommand" context="#stay"/>
0682         <DetectChar context="CommandVariables" char="$" lookAhead="1"/>
0683         <IncludeRules context="FindStrings"/>
0684         <Detect2Chars attribute="Control" context="#pop#pop" char="&amp;" char1="&amp;"/>
0685         <Detect2Chars attribute="Control" context="#pop#pop" char="|" char1="|"/>
0686         <DetectChar attribute="Control" context="#pop#pop" char="|"/>
0687         <AnyChar context="#pop#pop" String=";)`" lookAhead="1"/>
0688         <AnyChar context="#pop#pop!CommandArgs" String="&amp;&lt;>" lookAhead="1"/>
0689         <!-- start expression in double parentheses -->
0690         <Detect2Chars attribute="Error" context="#pop#pop!ExprDblParen" char="(" char1="(" beginRegion="expression"/>
0691         <!-- start a subshell -->
0692         <DetectChar attribute="Error" context="#pop#pop!SubShell" char="(" beginRegion="subshell"/>
0693         <LineContinue attribute="Escape" context="#stay"/>
0694         <DetectChar context="#pop!CommandMaybeBraceExpansion" char="{" lookAhead="1"/>
0695       </context>
0696       <context attribute="Normal Text" lineEndContext="#pop" name="CommandMaybeBraceExpansion">
0697         <IncludeRules context="DispatchBraceExpansion"/>
0698         <DetectChar attribute="OtherCommand" context="#pop" char="{"/>
0699       </context>
0700 
0701       <context attribute="Normal Text" lineEndContext="#stay" name="CommandBackq" fallthroughContext="Command">
0702         <DetectChar attribute="Backquote" context="#pop!CommandArgs" char="`"/>
0703         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
0704         <IncludeRules context="Start"/>
0705       </context>
0706       <!-- CommentBackq consumes shell comments till EOL or a backquote -->
0707       <context attribute="Comment" lineEndContext="#pop" name="CommentBackq">
0708         <DetectChar context="#pop" char="`" lookAhead="1"/>
0709         <IncludeRules context="Comment"/>
0710       </context>
0711 
0712       <!-- CommandArgs matches the items after a command -->
0713       <context attribute="Normal Text" lineEndContext="#pop" name="CommandArgs" fallthroughContext="CommandArg">
0714         <DetectSpaces attribute="Normal Text" context="#stay"/>
0715 
0716         <!-- &> and &>> redirection -->
0717         <StringDetect attribute="Redirection" context="WordRedirection" String="&amp;>>"/>
0718         <Detect2Chars attribute="Redirection" context="FdRedirection" char="&amp;" char1=">"/>
0719 
0720         <!-- handle &, |, ;, ` -->
0721         <AnyChar context="#pop" String="&amp;|;`" lookAhead="1"/>
0722 
0723         <!-- handle redirection -->
0724         <AnyChar context="CommandArgMaybeRedirection" String="&lt;&gt;0123456789" lookAhead="1"/>
0725 
0726         <DetectChar context="#pop" char=")" lookAhead="1"/>
0727         <DetectChar attribute="Error" context="#pop!SubShell" char="("/>
0728       </context>
0729       <context attribute="Normal Text" lineEndContext="#pop#pop" name="CommandArg" fallthroughContext="#pop!NormalOption">
0730         <!-- In command arguments, do not allow comments after escaped characters.
0731              This avoids highlighting comments within paths or other text. Ex: pathtext\ #no\ comment -->
0732         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0733         <Detect2Chars attribute="Option" context="#pop!LongOption" char="-" char1="-"/>
0734         <DetectChar attribute="Option" context="#pop!ShortOption" char="-"/>
0735       </context>
0736       <context attribute="Normal Text" lineEndContext="#pop" name="CommandArgMaybeRedirection" fallthroughContext="#pop!NormalOption">
0737         <IncludeRules context="FindRedirection"/>
0738       </context>
0739 
0740       <context attribute="Option" lineEndContext="#pop" name="ShortOption" fallthroughContext="#pop">
0741         <DetectChar attribute="Path" context="PathThenPop" char="/"/>
0742         <IncludeRules context="LongOption"/>
0743       </context>
0744       <context attribute="Option" lineEndContext="#pop" name="LongOption" fallthroughContext="#pop">
0745         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
0746         <DetectChar attribute="Operator" context="#pop!NormalOption" char="="/>
0747         <IncludeRules context="FindWord"/>
0748         <IncludeRules context="FindGlobAndPop"/>
0749         <DetectChar context="OptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0750         <DetectChar context="LongOptionMaybeGlobAny" char="[" lookAhead="1"/>
0751         <RegExpr attribute="Option" context="#stay" String="&opt;"/>
0752       </context>
0753       <context attribute="Option" lineEndContext="#pop#pop" name="LongOptionMaybeGlobAny" fallthroughContext="#pop">
0754         <IncludeRules context="FindGlobAny"/>
0755         <DetectChar attribute="Option" context="#pop" char="["/>
0756       </context>
0757       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOption" fallthroughContext="#pop">
0758         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
0759         <IncludeRules context="FindWord"/>
0760         <DetectChar context="NormalMaybeBraceExpansion" char="{" lookAhead="1"/>
0761         <IncludeRules context="FindNormalText"/>
0762       </context>
0763       <context attribute="Normal Text" lineEndContext="#stay" name="FindNormalText">
0764         <IncludeRules context="FindGlobAndPop"/>
0765         <RegExpr attribute="Path" context="PathThenPop" String="&pathpart;"/>
0766         <DetectChar context="FindPathThenPopMaybeGlobAny" char="[" lookAhead="1"/>
0767         <RegExpr attribute="Normal Text" context="#stay" String="[^&wordseps;&substseps;\[]+"/>
0768       </context>
0769       <context attribute="Normal Text" lineEndContext="#pop" name="OptionMaybeBraceExpansion">
0770         <IncludeRules context="DispatchBraceExpansion"/>
0771         <DetectChar attribute="Option" context="#pop" char="{"/>
0772       </context>
0773       <context attribute="Normal Text" lineEndContext="#pop" name="NormalMaybeBraceExpansion">
0774         <IncludeRules context="DispatchBraceExpansion"/>
0775         <DetectChar attribute="Normal Text" context="#pop" char="{"/>
0776       </context>
0777 
0778       <context attribute="Normal Text" lineEndContext="#pop" name="AssumeEscape">
0779         <LineContinue attribute="Escape" context="#pop"/>
0780         <RegExpr attribute="Escape" context="#pop" String="\\."/>
0781       </context>
0782 
0783 <!-- ====== The following rulessets are meant to be included ======== -->
0784 
0785       <!-- FindRedirection consumes shell redirection -->
0786       <context attribute="Normal Text" lineEndContext="#pop" name="FindRedirection">
0787         <RegExpr attribute="File Descriptor" context="#pop!AssumeRedirection" String="[0-9]++(?=[&lt;>])"/>
0788         <IncludeRules context="AssumeRedirection"/>
0789       </context>
0790 
0791       <!-- DispatchBraceExpansion consumes brace expansions -->
0792       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchBraceExpansion">
0793         <!-- Only highlighting closed braces. The "BraceExpansion" context corrects
0794              the closure of braces and allows recursive braces (bug #387915). -->
0795         <RegExpr context="#pop!BraceExpansion" String="&braceexpansion;" lookAhead="1"/>
0796         <RegExpr attribute="Escape" context="#pop!SequenceExpression" String="{(?=([-+]?[0-9]+\.\.[-+]?[0-9]+|[a-zA-Z]\.\.[a-zA-Z])(\.\.[-+]?[0-9]+)?\})"/>
0797       </context>
0798 
0799       <!-- FindPathThenPopMaybeGlobAny consumes path -->
0800       <context attribute="Normal Text" lineEndContext="#pop#pop" name="FindPathThenPopMaybeGlobAny" fallthroughContext="#pop!PathThenPop">
0801         <IncludeRules context="FindGlobAny"/>
0802         <DetectChar attribute="Normal Text" context="#pop" char="["/>
0803       </context>
0804       <context attribute="Path" lineEndContext="#pop" name="FindGlobAndPop">
0805         <Detect2Chars attribute="Glob" context="ExtGlobAndPop" char="?" char1="("/>
0806         <Detect2Chars attribute="Glob" context="ExtGlobAndPop" char="*" char1="("/>
0807         <AnyChar attribute="Glob" context="PathThenPop" String="?*"/>
0808         <Detect2Chars attribute="Glob" context="ExtGlobAndPop" char="+" char1="("/>
0809         <Detect2Chars attribute="Glob" context="ExtGlobAndPop" char="@" char1="("/>
0810         <Detect2Chars attribute="Glob" context="ExtGlobAndPop" char="!" char1="("/>
0811       </context>
0812       <context attribute="Path" lineEndContext="#stay" name="ExtGlobAndPop">
0813         <DetectChar attribute="Glob" context="#pop!PathThenPop" char=")"/>
0814         <IncludeRules context="FindWord"/>
0815         <IncludeRules context="IncExtGlob"/>
0816       </context>
0817       <context attribute="Path" lineEndContext="#stay" name="FindExtGlob">
0818         <Detect2Chars attribute="Glob" context="RecursiveExtGlob" char="?" char1="("/>
0819         <Detect2Chars attribute="Glob" context="RecursiveExtGlob" char="*" char1="("/>
0820         <Detect2Chars attribute="Glob" context="RecursiveExtGlob" char="+" char1="("/>
0821         <Detect2Chars attribute="Glob" context="RecursiveExtGlob" char="@" char1="("/>
0822         <Detect2Chars attribute="Glob" context="RecursiveExtGlob" char="!" char1="("/>
0823         <AnyChar attribute="Glob" context="#stay" String="|?*"/>
0824       </context>
0825       <context attribute="Path" lineEndContext="#stay" name="RecursiveExtGlob">
0826         <DetectChar attribute="Glob" context="#pop" char=")"/>
0827         <IncludeRules context="FindWord"/>
0828         <IncludeRules context="IncExtGlob"/>
0829         <IncludeRules context="PathThenPopMaybeGlobAny"/>
0830       </context>
0831       <context attribute="Path" lineEndContext="#stay" name="IncExtGlob">
0832         <DetectIdentifier attribute="Path"/>
0833         <IncludeRules context="FindExtGlob"/>
0834         <DetectChar context="PathMaybeBraceExpansion" char="{" lookAhead="1"/>
0835       </context>
0836       <context attribute="Path" lineEndContext="#pop#pop" name="PathThenPop">
0837         <AnyChar context="#pop#pop" String="&wordseps;`" lookAhead="1"/>
0838         <IncludeRules context="FindWord"/>
0839         <IncludeRules context="FindExtGlob"/>
0840         <DetectChar context="PathMaybeBraceExpansion" char="{" lookAhead="1"/>
0841         <DetectChar context="PathThenPopMaybeGlobAny" char="[" lookAhead="1"/>
0842         <RegExpr attribute="Path" context="#stay" String="&path;"/>
0843       </context>
0844       <context attribute="Path" lineEndContext="#pop#pop" name="PathThenPopMaybeGlobAny" fallthroughContext="#pop">
0845         <IncludeRules context="FindGlobAny"/>
0846         <DetectChar attribute="Path" context="#pop" char="["/>
0847       </context>
0848       <context attribute="Path" lineEndContext="#pop" name="PathMaybeBraceExpansion" fallthroughContext="#pop">
0849         <IncludeRules context="DispatchBraceExpansion"/>
0850         <DetectChar attribute="Path" context="#pop" char="{"/>
0851       </context>
0852 
0853       <context attribute="Glob" lineEndContext="#stay" name="FindGlobAny">
0854         <RegExpr attribute="Glob" context="GlobAnyFlag" String="\[(?=&next_is_globany;)"/>
0855       </context>
0856       <context attribute="Pattern" lineEndContext="#pop" name="GlobAnyFlag" fallthroughContext="#pop!GlobAny">
0857         <DetectChar attribute="Glob" context="#pop!GlobAny" char="^"/>
0858       </context>
0859       <context attribute="Pattern" lineEndContext="#pop" name="GlobAny">
0860         <DetectIdentifier attribute="Pattern"/>
0861         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0862         <DetectChar attribute="Glob" context="#stay" char="-"/>
0863         <IncludeRules context="FindStrings"/>
0864         <DetectChar attribute="Glob" context="#pop" char="]"/>
0865         <Detect2Chars attribute="Glob" context="GlobClass" char="[" char1=":"/>
0866       </context>
0867       <context attribute="Glob" lineEndContext="#pop#pop" name="GlobClass">
0868         <DetectIdentifier attribute="Pattern"/>
0869         <Detect2Chars attribute="Glob" context="#pop" char=":" char1="]"/>
0870         <DetectChar attribute="Error" context="#pop" char="]"/>
0871       </context>
0872 
0873       <!-- FindPathThenPopInAlternateValue consumes path in ${xx:here}-->
0874       <context attribute="Normal Text" lineEndContext="#pop" name="FindPathThenPopInAlternateValue">
0875         <Detect2Chars context="#pop!PathThenPopInAlternateValue" char="?" char1="(" lookAhead="1"/>
0876         <Detect2Chars context="#pop!PathThenPopInAlternateValue" char="*" char1="(" lookAhead="1"/>
0877         <Detect2Chars context="#pop!PathThenPopInAlternateValue" char="+" char1="(" lookAhead="1"/>
0878         <Detect2Chars context="#pop!PathThenPopInAlternateValue" char="@" char1="(" lookAhead="1"/>
0879         <Detect2Chars context="#pop!PathThenPopInAlternateValue" char="!" char1="(" lookAhead="1"/>
0880         <AnyChar attribute="Glob" context="#pop!PathThenPopInAlternateValue" String="?*"/>
0881         <RegExpr attribute="Path" context="#pop!PathThenPopInAlternateValue" String="&pathpart_alt;"/>
0882       </context>
0883       <context attribute="Path" lineEndContext="#pop#pop" name="PathThenPopInAlternateValue">
0884         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
0885         <IncludeRules context="FindWord"/>
0886         <Detect2Chars attribute="Glob" context="ExtGlobAndPopInAlternateValue" char="?" char1="("/>
0887         <Detect2Chars attribute="Glob" context="ExtGlobAndPopInAlternateValue" char="*" char1="("/>
0888         <Detect2Chars attribute="Glob" context="ExtGlobAndPopInAlternateValue" char="+" char1="("/>
0889         <Detect2Chars attribute="Glob" context="ExtGlobAndPopInAlternateValue" char="@" char1="("/>
0890         <Detect2Chars attribute="Glob" context="ExtGlobAndPopInAlternateValue" char="!" char1="("/>
0891         <AnyChar attribute="Glob" context="#stay" String="?*"/>
0892         <RegExpr attribute="Path" context="#stay" String="&path_alt;"/>
0893       </context>
0894       <context attribute="Path" lineEndContext="#stay" name="ExtGlobAndPopInAlternateValue">
0895         <DetectChar attribute="Glob" context="#pop" char=")"/>
0896         <DetectChar attribute="Error" context="#pop#pop" char="}"/>
0897         <IncludeRules context="FindWord"/>
0898         <IncludeRules context="FindExtGlobInAlternateValue"/>
0899       </context>
0900       <context attribute="Path" lineEndContext="#stay" name="FindExtGlobInAlternateValue">
0901         <DetectIdentifier attribute="Path"/>
0902         <Detect2Chars attribute="Glob" context="RecursiveExtGlobInAlternateValue" char="?" char1="("/>
0903         <Detect2Chars attribute="Glob" context="RecursiveExtGlobInAlternateValue" char="*" char1="("/>
0904         <Detect2Chars attribute="Glob" context="RecursiveExtGlobInAlternateValue" char="+" char1="("/>
0905         <Detect2Chars attribute="Glob" context="RecursiveExtGlobInAlternateValue" char="@" char1="("/>
0906         <Detect2Chars attribute="Glob" context="RecursiveExtGlobInAlternateValue" char="!" char1="("/>
0907         <AnyChar attribute="Glob" context="#stay" String="|?*"/>
0908       </context>
0909       <context attribute="Path" lineEndContext="#stay" name="RecursiveExtGlobInAlternateValue">
0910         <DetectChar attribute="Glob" context="#pop" char=")"/>
0911         <DetectChar context="#pop" char="}" lookAhead="1"/>
0912         <IncludeRules context="FindWord"/>
0913         <IncludeRules context="FindExtGlobInAlternateValue"/>
0914       </context>
0915 
0916       <context attribute="Pattern" lineEndContext="#stay" name="FindPattern">
0917         <Detect2Chars attribute="Glob" context="ExtPattern" char="?" char1="("/>
0918         <Detect2Chars attribute="Glob" context="ExtPattern" char="*" char1="("/>
0919         <Detect2Chars attribute="Glob" context="ExtPattern" char="+" char1="("/>
0920         <Detect2Chars attribute="Glob" context="ExtPattern" char="@" char1="("/>
0921         <Detect2Chars attribute="Glob" context="ExtPattern" char="!" char1="("/>
0922         <AnyChar attribute="Glob" context="#stay" String="?*"/>
0923       </context>
0924       <context attribute="Pattern" lineEndContext="#stay" name="ExtPattern">
0925         <DetectIdentifier attribute="Pattern"/>
0926         <DetectChar attribute="Glob" context="#stay" char="|"/>
0927         <IncludeRules context="FindWord"/>
0928         <DetectChar attribute="Glob" context="#pop" char=")"/>
0929         <IncludeRules context="FindPattern"/>
0930       </context>
0931 
0932       <context attribute="Normal Text" lineEndContext="#pop" name="VarAssign" fallthroughContext="#pop">
0933         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0934         <DetectChar attribute="Operator" context="#pop!Assign" char="="/>
0935         <Detect2Chars attribute="Operator" context="#pop!Assign" char="+" char1="="/>
0936       </context>
0937 
0938       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchKeyword">
0939         <!-- match do and if blocks -->
0940         <Detect2Chars attribute="Control Flow" context="#pop!NotCond" char="i" char1="f" beginRegion="if"/>
0941         <Detect2Chars attribute="Control Flow" context="#pop" char="f" char1="i" endRegion="if"/>
0942         <StringDetect attribute="Control Flow" context="#pop" String="done" endRegion="do"/>
0943         <Detect2Chars attribute="Control Flow" context="#pop" char="d" char1="o" beginRegion="do"/>
0944         <!-- handle while/until as a special case -->
0945         <StringDetect attribute="Control Flow" context="#pop!NotCond" String="while"/>
0946         <StringDetect attribute="Control Flow" context="#pop!NotCond" String="until"/>
0947         <!-- handle for as a special case -->
0948         <StringDetect attribute="Control Flow" context="#pop!For" String="for"/>
0949         <!-- handle select as a special case -->
0950         <StringDetect attribute="Control Flow" context="#pop!For" String="select"/>
0951         <!-- handle case as a special case -->
0952         <StringDetect attribute="Control Flow" context="#pop!Case" String="case" beginRegion="case"/>
0953         <!-- handle functions with function keyword before keywords -->
0954         <StringDetect attribute="Keyword" context="#pop!FunctionDef" String="function"/>
0955         <StringDetect attribute="Control Flow" context="#pop!Return" String="return"/>
0956         <!-- not a keyword in this context -->
0957         <Detect2Chars attribute="Error" context="#pop" char="i" char1="n"/>
0958         <StringDetect attribute="Error" context="#pop" String="esac"/>
0959         <!-- handle keywords -->
0960         <DetectIdentifier attribute="Control Flow" context="#pop"/>
0961       </context>
0962 
0963       <!-- if ! ..., while ! ... and until ! ... -->
0964       <context attribute="Normal Text" lineEndContext="#pop" name="NotCond" fallthroughContext="#pop">
0965         <DetectSpaces attribute="Normal Text" context="#pop!NotCond2"/>
0966       </context>
0967       <context attribute="Normal Text" lineEndContext="#pop" name="NotCond2" fallthroughContext="#pop">
0968         <Detect2Chars attribute="Expression" context="#pop" char="!" char1="&tab;"/>
0969         <Detect2Chars attribute="Expression" context="#pop" char="!" char1=" "/>
0970         <LineContinue attribute="Expression" context="#pop" char="!"/>
0971       </context>
0972 
0973       <context attribute="Normal Text" lineEndContext="#pop" name="For" fallthroughContext="#pop">
0974         <LineContinue attribute="Escape" context="#stay"/>
0975         <DetectSpaces attribute="Normal Text" context="#stay"/>
0976         <DetectIdentifier attribute="Normal Text" context="#pop!ForIn"/>
0977         <Detect2Chars attribute="Keyword" context="#pop!ForArithmeticExpr" char="(" char1="("/>
0978       </context>
0979       <context attribute="Normal Text" lineEndContext="#pop" name="ForIn" fallthroughContext="#pop">
0980         <DetectSpaces attribute="Normal Text" context="#stay"/>
0981         <DetectChar attribute="Control" context="#pop" char=";"/>
0982         <WordDetect attribute="Keyword" context="#pop!CommandArgs" String="in"/>
0983       </context>
0984       <context attribute="Normal Text" lineEndContext="#pop" name="ForArithmeticExpr">
0985         <DetectSpaces attribute="Normal Text" context="#stay"/>
0986         <DetectChar attribute="Control" context="#stay" char=";"/>
0987         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")"/>
0988         <IncludeRules context="FindExprDblParen"/>
0989       </context>
0990 
0991       <context attribute="Normal Text" lineEndContext="#pop" name="AssumeRedirection">
0992         <!-- handle output redirection -->
0993         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1=">"/>
0994         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="|"/>
0995         <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char=">" char1="&amp;"/>
0996         <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char=">" char1="("/>
0997         <DetectChar attribute="Redirection" context="#pop!WordRedirection" char=">"/>
0998         <StringDetect attribute="Redirection" context="#pop!StringRedirection" String="&lt;&lt;&lt;"/>
0999         <!-- handle here document -->
1000         <Detect2Chars context="#pop!HereDoc" char="&lt;" char1="&lt;" lookAhead="1"/>
1001         <!-- handle input redirection -->
1002         <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char="&lt;" char1="&amp;"/>
1003         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char="&lt;" char1=">"/>
1004         <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char="&lt;" char1="("/>
1005         <DetectChar attribute="Redirection" context="#pop!WordRedirection" char="&lt;"/>
1006       </context>
1007       <context attribute="Normal Text" lineEndContext="#pop" name="FdRedirection" fallthroughContext="#pop!FdRedirection2">
1008         <DetectSpaces attribute="Normal Text"/>
1009         <DetectChar attribute="Comment" context="#pop!Comment" char="#"/>
1010       </context>
1011       <context attribute="Normal Text" lineEndContext="#pop" name="FdRedirection2" fallthroughContext="#pop!WordRedirection2">
1012         <RegExpr attribute="File Descriptor" context="#pop!CloseFile" String="[0-9]+(?=-?&eoexpr;)"/>
1013       </context>
1014       <context attribute="Normal Text" lineEndContext="#pop" name="WordRedirection" fallthroughContext="#pop!WordRedirection2">
1015         <DetectSpaces attribute="Normal Text"/>
1016         <DetectChar attribute="Comment" context="#pop!Comment" char="#"/>
1017       </context>
1018       <context attribute="Normal Text" lineEndContext="#pop" name="WordRedirection2" fallthroughContext="#pop">
1019         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
1020         <IncludeRules context="FindWord"/>
1021         <RegExpr attribute="Path" context="PathThenPop" String="&path;"/>
1022       </context>
1023       <context attribute="Normal Text" lineEndContext="#pop" name="StringRedirection" fallthroughContext="#pop!StringRedirection2">
1024         <DetectSpaces attribute="Normal Text"/>
1025         <DetectChar attribute="Comment" context="#pop!Comment" char="#"/>
1026       </context>
1027       <context attribute="Normal Text" lineEndContext="#pop" name="StringRedirection2">
1028         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
1029         <IncludeRules context="FindWord"/>
1030         <DetectIdentifier attribute="Normal Text"/>
1031       </context>
1032       <context attribute="Normal Text" lineEndContext="#pop" name="CloseFile" fallthroughContext="#pop">
1033         <DetectChar attribute="Keyword" context="#pop" char="-"/>
1034       </context>
1035 
1036       <!-- HereDoc consumes Here-documents. It is called at the beginning of the "<<" construct. -->
1037       <context attribute="Normal Text" lineEndContext="#stay" name="HereDoc">
1038         <RegExpr attribute="Redirection" context="HereDocMLComment" String="^[ &tab;]*&lt;&lt;[ &tab;]*'#([^']+)'$" column="0"/>
1039         <RegExpr attribute="Redirection" context="HereDocIQ"  String="&lt;&lt;-[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
1040         <RegExpr attribute="Redirection" context="HereDocINQ" String="&lt;&lt;-[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
1041         <RegExpr attribute="Redirection" context="HereDocQ"   String="&lt;&lt;[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
1042         <RegExpr attribute="Redirection" context="HereDocNQ"  String="&lt;&lt;[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
1043 
1044         <RegExpr context="HereDocIQCmd"  String="(&lt;&lt;-[ &tab;]*&heredocq;)" lookAhead="1"/>
1045         <RegExpr context="HereDocINQCmd" String="(&lt;&lt;-[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
1046         <RegExpr context="HereDocQCmd"   String="(&lt;&lt;[ &tab;]*&heredocq;)" lookAhead="1"/>
1047         <RegExpr context="HereDocNQCmd"  String="(&lt;&lt;[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
1048 
1049         <Detect2Chars attribute="Redirection" context="#pop"  char="&lt;" char1="&lt;"/><!-- always met -->
1050       </context>
1051 
1052       <context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder" fallthroughContext="CommandArg">
1053         <AnyChar context="BashOneLine" String="&amp;|;`" lookAhead="1"/>
1054         <IncludeRules context="CommandArgs"/>
1055       </context>
1056 
1057       <!-- Highlight the builtin `:` (true) and the followed redirection, then fall into `HereDocMLComment` -->
1058       <context attribute="Comment" lineEndContext="#stay" name="PreHereDocMLComment">
1059         <DetectChar attribute="Builtin" context="#stay" char=":" column="0"/>
1060         <RegExpr attribute="Redirection" context="HereDocMLComment" String="&lt;&lt;[ &tab;]*'#([^']+)'$"/>
1061       </context>
1062 
1063       <context attribute="Comment" lineEndContext="#stay" name="HereDocMLComment" dynamic="true" fallthroughContext="Comment">
1064         <RegExpr attribute="Redirection" context="#pop#pop" String="^#%1$" column="0" dynamic="true"/>
1065         <RegExpr attribute="Region Marker" context="RST Documentation" String="^#?\[(=*)\[\.rst:" column="0" beginRegion="RSTDocumentation" />
1066         <IncludeRules context="Comment"/>
1067       </context>
1068 
1069       <context attribute="Comment" lineEndContext="#stay" name="RST Documentation" dynamic="true">
1070         <RegExpr attribute="Redirection" context="#pop#pop#pop" String="^#BLOCK-COMMENT$" column="0"/>
1071         <RegExpr attribute="Region Marker" context="#pop" String="^#?\]%1\]" dynamic="true" column="0" endRegion="RSTDocumentation" />
1072         <IncludeRules context="##reStructuredText" />
1073       </context>
1074 
1075       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocQ" dynamic="true" fallthroughContext="HereDocText">
1076         <RegExpr attribute="Redirection" context="#pop#pop" String="^%1$" dynamic="true" column="0"/>
1077       </context>
1078 
1079       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocNQ" dynamic="true" fallthroughContext="HereDocSubstitutions">
1080         <IncludeRules context="HereDocQ" />
1081       </context>
1082 
1083       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocIQ" dynamic="true" fallthroughContext="HereDocText">
1084         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%1$" dynamic="true" column="0"/>
1085       </context>
1086 
1087       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocINQ" dynamic="true" fallthroughContext="HereDocSubstitutions">
1088         <IncludeRules context="HereDocIQ" />
1089       </context>
1090 
1091       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocCmd">
1092         <!-- Only if the redirect is before the command, but as this is too complicated,
1093              check if the redirect is at the beginning of the line. -->
1094         <StringDetect attribute="Redirection" context="BashOneLine" String="%1" dynamic="true" firstNonSpace="1"/>
1095         <StringDetect attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true"/>
1096       </context>
1097 
1098       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocQCmd" dynamic="true" fallthroughContext="HereDocText">
1099         <IncludeRules context="HereDocCmd"/>
1100         <RegExpr attribute="Redirection" context="#pop#pop" String="^%2$" dynamic="true" column="0"/>
1101       </context>
1102 
1103       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocNQCmd" dynamic="true" fallthroughContext="HereDocSubstitutions">
1104         <IncludeRules context="HereDocQCmd"/>
1105       </context>
1106 
1107       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocIQCmd" dynamic="true" fallthroughContext="HereDocText">
1108         <IncludeRules context="HereDocCmd"/>
1109         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2$" dynamic="true" column="0"/>
1110       </context>
1111 
1112       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocINQCmd" dynamic="true" fallthroughContext="HereDocSubstitutions">
1113         <IncludeRules context="HereDocIQCmd"/>
1114       </context>
1115 
1116       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocText">
1117       </context>
1118 
1119       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocSubstitutions">
1120         <DetectSpaces attribute="Here Doc"/>
1121         <DetectIdentifier attribute="Here Doc"/>
1122         <DetectChar context="HereDocVariables" char="$" lookAhead="1"/>
1123         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
1124         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1125       </context>
1126       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocVariables">
1127         <IncludeRules context="DispatchSubstVariables"/>
1128         <IncludeRules context="DispatchVarnameVariables"/>
1129         <DetectChar attribute="Here Doc" context="#pop" char="$"/>
1130       </context>
1131 
1132       <!-- VarName consumes spare variable names and assignments -->
1133       <context attribute="Normal Text" lineEndContext="#pop" name="VarName">
1134         <StringDetect attribute="Builtin" context="#pop!BuiltinGetopts" String="getopts"/>
1135         <StringDetect attribute="Builtin" context="#pop!BuiltinLet" String="let"/>
1136         <DetectIdentifier attribute="Builtin" context="#pop!VarNameArgs"/>
1137         <AnyChar attribute="Builtin" context="#pop!VarNameArgs" String=".:"/>
1138       </context>
1139       <context attribute="Normal Text" lineEndContext="#pop" name="VarNameArgs" fallthroughContext="#pop!CommandArgs">
1140         <DetectSpaces attribute="Normal Text" context="VarNameArg"/>
1141         <LineContinue attribute="Escape" context="#stay"/>
1142       </context>
1143       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameArg" fallthroughContext="#pop!VarNameArg2">
1144         <!-- In command arguments, do not allow comments after escaped characters.
1145              This avoids highlighting comments within paths or other text. Ex: pathtext\ #no\ comment -->
1146         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
1147         <DetectChar attribute="Option" context="#pop!ShortOption" char="-"/>
1148       </context>
1149       <context attribute="Normal Text" lineEndContext="#pop" name="VarNameArg2" fallthroughContext="#pop!NormalOption">
1150         <DetectChar attribute="Variable" context="Subscript" char="["/>
1151         <DetectChar attribute="Operator" context="Assign" char="="/>
1152         <DetectChar attribute="Variable" context="AssignArray" char="("/>
1153         <DetectIdentifier attribute="Variable" context="#stay"/>
1154       </context>
1155       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetopts" fallthroughContext="#pop!CommandArgs">
1156         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinGetoptsOpt"/>
1157         <LineContinue attribute="Escape" context="#stay"/>
1158       </context>
1159       <context attribute="Normal Text" lineEndContext="#pop#pop" name="BuiltinGetoptsOpt" fallthroughContext="#pop!BuiltinGetoptsOpt2">
1160         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
1161       </context>
1162       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetoptsOpt2" fallthroughContext="#pop!NormalOption">
1163         <DetectChar attribute="Operator" context="#stay" char=":"/>
1164         <DetectIdentifier attribute="Normal Text" context="#stay" />
1165         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinGetoptsVar"/>
1166         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
1167         <IncludeRules context="FindWord"/>
1168         <DetectChar context="NormalMaybeBraceExpansion" char="{" lookAhead="1"/>
1169         <AnyChar attribute="Normal Text" context="#stay" String="/%.0123456789"/>
1170       </context>
1171       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetoptsVar" fallthroughContext="#pop!CommandArgs">
1172         <DetectIdentifier attribute="Variable" context="#pop!CommandArgs"/>
1173       </context>
1174       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLet" fallthroughContext="#pop!CommandArgs">
1175         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinLetArgs"/>
1176         <LineContinue attribute="Escape" context="#stay"/>
1177       </context>
1178       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetArgs" fallthroughContext="BuiltinLetArg">
1179         <AnyChar context="BuiltinLetArgsNumber" String="0123456789" lookAhead="1"/>
1180         <IncludeRules context="CommandArgs"/>
1181       </context>
1182       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetArgsNumber" fallthroughContext="#pop!BuiltinLetArg">
1183         <IncludeRules context="FindRedirection"/>
1184       </context>
1185       <context attribute="Normal Text" lineEndContext="#pop#pop" name="BuiltinLetArg" fallthroughContext="#pop!BuiltinLetExpr">
1186         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
1187       </context>
1188       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetExpr" fallthroughContext="#pop!NormalOption">
1189         <DetectIdentifier attribute="Variable" context="#stay" />
1190         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
1191         <AnyChar attribute="Operator" context="#stay" String="+-/%=^:"/>
1192         <AnyChar context="Number" String="0123456789" lookAhead="1"/>
1193         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1194         <IncludeRules context="FindWord"/>
1195         <DetectChar attribute="Error" context="#stay" char="#"/>
1196         <DetectChar context="NormalMaybeBraceExpansion" char="{" lookAhead="1"/>
1197       </context>
1198 
1199       <!-- ProcessSubst handles <(command) and >(command) -->
1200       <context attribute="Normal Text" lineEndContext="#stay" name="ProcessSubst" fallthroughContext="Command">
1201         <DetectChar attribute="Redirection" context="#pop" char=")"/>
1202         <IncludeRules context="Start"/>
1203       </context>
1204 
1205       <!-- StringSQ consumes anything till ' -->
1206       <context attribute="String SingleQ" lineEndContext="#stay" name="StringSQ">
1207         <DetectSpaces attribute="String SingleQ"/>
1208         <DetectIdentifier attribute="String SingleQ"/>
1209         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
1210       </context>
1211 
1212       <!-- StringDQ consumes anything till ", substitutes vars and expressions -->
1213       <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQ">
1214         <DetectSpaces attribute="String DoubleQ"/>
1215         <DetectIdentifier attribute="String DoubleQ"/>
1216         <DetectChar attribute="String DoubleQ" context="#pop" char="&quot;"/>
1217         <DetectChar context="StringDQEscape" char="\" lookAhead="1"/>
1218         <DetectChar context="StringDQDispatchVariables" char="$" lookAhead="1"/>
1219         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1220       </context>
1221       <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQDispatchVariables">
1222         <IncludeRules context="DispatchSubstVariables"/>
1223         <IncludeRules context="DispatchVarnameVariables"/>
1224         <DetectChar attribute="String DoubleQ" context="#pop" char="$"/>
1225       </context>
1226       <context attribute="String DoubleQ" lineEndContext="#pop" name="StringDQEscape">
1227         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="&quot;"/>
1228         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="\"/>
1229         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="`"/>
1230         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="$"/>
1231         <LineContinue attribute="String Escape" context="#pop"/>
1232         <DetectChar attribute="String DoubleQ" context="#pop" char="\"/>
1233       </context>
1234 
1235       <!-- RegularBackq consumes anything till ` -->
1236       <context attribute="Normal Text" lineEndContext="#stay" name="RegularBackq" fallthroughContext="Command">
1237         <DetectChar attribute="Backquote" context="#pop" char="`"/>
1238         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
1239         <IncludeRules context="Start"/>
1240       </context>
1241 
1242       <!-- StringEsc eats till ', but escaping many characters -->
1243       <context attribute="String SingleQ" lineEndContext="#stay" name="StringEsc">
1244         <DetectSpaces attribute="String SingleQ"/>
1245         <DetectIdentifier attribute="String SingleQ"/>
1246         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
1247         <RegExpr attribute="String Escape" context="#stay" String="\\(?:[abefnrtv\\']|[0-7]{1,3}|x[A-Fa-f0-9]{1,2}|c.)"/>
1248       </context>
1249 
1250       <context attribute="Normal Text" lineEndContext="#stay" name="FindWord">
1251         <IncludeRules context="FindStrings"/>
1252         <DetectChar context="RegularVariable" char="$" lookAhead="1"/>
1253         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1254         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1255       </context>
1256       <context attribute="Normal Text" lineEndContext="#pop" name="RegularVariable">
1257         <IncludeRules context="DispatchVariables"/>
1258         <DetectChar attribute="Normal Text" context="#pop" char="$"/>
1259       </context>
1260 
1261       <context attribute="Normal Text" lineEndContext="#pop" name="FindStrings">
1262         <DetectChar attribute="String SingleQ" context="StringSQ" char="'"/>
1263         <DetectChar attribute="String DoubleQ" context="StringDQ" char="&quot;"/>
1264       </context>
1265 
1266       <!-- SubstCommand is called after a $( is encountered -->
1267       <context attribute="Normal Text" lineEndContext="#stay" name="SubstCommand" fallthroughContext="Command">
1268         <DetectChar attribute="Parameter Expansion" context="#pop" char=")" endRegion="subshell"/>
1269         <IncludeRules context="Start"/>
1270       </context>
1271 
1272       <!-- VarBraceStart is called as soon as ${ is encoutered -->
1273       <context attribute="Variable" lineEndContext="#pop!VarBrace" name="VarBraceStart" fallthroughContext="#pop!VarBrace">
1274         <StringDetect context="#pop!VarBrace" String="!}" lookAhead="1"/>
1275         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBracePrefix" char="!"/>
1276         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBrace" char="#"/>
1277       </context>
1278 
1279       <!-- VarBracePrefix called as soon as ${! is encoutered -->
1280       <context attribute="Variable" lineEndContext="#pop" name="VarBracePrefix">
1281         <DetectIdentifier attribute="Variable" context="#pop!VarBracePrefixSuffix"/>
1282         <Int attribute="Variable" context="#pop!VarBracePrefixSuffix"/>
1283         <AnyChar attribute="Parameter Expansion Operator" context="#pop!VarBracePrefixSharp" String="@*#"/>
1284         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1285       </context>
1286       <context attribute="Variable" lineEndContext="#pop" name="VarBracePrefixSuffix" fallthroughContext="#pop!VarError">
1287         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1288         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="@*"/>
1289         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[@]"/>
1290         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[*]"/>
1291       </context>
1292       <context attribute="Variable" lineEndContext="#pop" name="VarBracePrefixSharp" fallthroughContext="#pop!VarError">
1293         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1294         <DetectChar attribute="Parameter Expansion Operator" char="#"/>
1295       </context>
1296 
1297       <!-- VarBrace is called as soon as ${ or ${# are encoutered -->
1298       <context attribute="Variable" lineEndContext="#stay" name="VarBrace" fallthroughContext="#pop!VarError">
1299         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1300         <DetectIdentifier attribute="Variable" context="#pop!CheckVarAlt"/>
1301         <AnyChar attribute="Variable" context="#pop!CheckVarAlt" String="*@?$!-"/>
1302         <Int attribute="Variable" context="#pop!CheckVarAlt" additionalDeliminator=":#%^,/@{}"/>
1303       </context>
1304       <context attribute="Error" lineEndContext="#stay" name="VarError">
1305         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1306       </context>
1307       <context attribute="Normal Text" lineEndContext="#stay" name="CheckVarAlt" fallthroughContext="#pop!VarError">
1308         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1309         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[@]"/>
1310         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[*]"/>
1311         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1312         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char=":" char1="-"/>
1313         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char=":" char1="="/>
1314         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char=":" char1="?"/>
1315         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char=":" char1="+"/>
1316         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="#" char1="#"/>
1317         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="%" char1="%"/>
1318         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="^" char1="^"/>
1319         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="," char1=","/>
1320         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarSub" char=":"/>
1321         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarSubst" char="/"/>
1322         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" String="-+=?#%"/>
1323         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" String="^,"/>
1324         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarTransformation" char="@"/>
1325       </context>
1326 
1327       <!-- called as soon as ${xxx: is encoutered -->
1328       <context attribute="Normal Text" lineEndContext="#stay" name="VarSub">
1329         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1330         <!-- <Int> doesn't match :3 because : is a weakDeliminator -->
1331         <AnyChar attribute="Decimal" String="0123456789"/>
1332         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
1333         <DetectChar context="VarVariables" char="$" lookAhead="1"/>
1334         <IncludeRules context="FindStrings"/>
1335         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1336         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1337       </context>
1338       <context attribute="Command" lineEndContext="#pop" name="VarVariables">
1339         <IncludeRules context="DispatchVariables"/>
1340         <DetectChar attribute="Error" context="#pop" char="$"/>
1341       </context>
1342 
1343       <!-- called as soon as ${xxx:- ${xxx:= ${xxx:? ${xxx:+ ${xxx# ${xxx% and ${xxx are encoutered -->
1344       <context attribute="Normal Text" lineEndContext="#stay" name="AlternateValue">
1345         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1346         <IncludeRules context="FindWord"/>
1347         <IncludeRules context="FindPathThenPopInAlternateValue"/>
1348         <DetectIdentifier attribute="Normal Text"/>
1349       </context>
1350 
1351       <!-- called as soon as ${xxx^ are ${xxx, are encoutered -->
1352       <context attribute="Pattern" lineEndContext="#stay" name="AlternatePatternValue">
1353         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1354         <IncludeRules context="FindWord"/>
1355         <IncludeRules context="FindPattern"/>
1356         <DetectIdentifier attribute="Pattern"/>
1357       </context>
1358 
1359       <!-- called as soon as ${xxx/ is encoutered -->
1360       <context attribute="Normal Text" lineEndContext="#stay" name="VarSubst" fallthroughContext="#pop!VarSubstPat">
1361         <AnyChar attribute="Parameter Expansion Operator" context="#pop!VarSubstPat" String="/#%"/>
1362       </context>
1363       <context attribute="Pattern" lineEndContext="#stay" name="VarSubstPat">
1364         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="/"/>
1365         <IncludeRules context="AlternatePatternValue"/>
1366       </context>
1367 
1368       <!-- called as soon as ${xxx@ is encoutered -->
1369       <context attribute="Normal Text" lineEndContext="#stay" name="VarTransformation" fallthroughContext="#pop!VarError">
1370         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1371         <AnyChar attribute="Parameter Expansion" context="#stay" String="UuLQEPAKa"/>
1372       </context>
1373 
1374       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansion">
1375         <DetectChar attribute="Escape" context="#pop!BraceExpansion2" char="{"/>
1376       </context>
1377       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansion2">
1378         <DetectChar attribute="Operator" context="#stay" char=","/>
1379         <DetectChar attribute="Escape" context="#pop" char="}"/>
1380         <DetectChar context="EscapeMaybeBraceExpansion" char="{" lookAhead="1"/>
1381         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1382         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
1383         <DetectChar context="BraceExpansionVariables" char="$" lookAhead="1"/>
1384         <IncludeRules context="FindStrings"/>
1385         <IncludeRules context="FindPattern"/>
1386         <DetectIdentifier attribute="Escape"/>
1387       </context>
1388       <context attribute="Escape" lineEndContext="#pop" name="EscapeMaybeBraceExpansion">
1389         <IncludeRules context="DispatchBraceExpansion"/>
1390         <DetectChar attribute="Escape" context="#pop!BraceExpansion2" char="{"/>
1391       </context>
1392       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansionVariables">
1393         <IncludeRules context="DispatchVariables"/>
1394         <DetectChar attribute="Escape" context="#pop" char="$"/>
1395       </context>
1396 
1397       <context attribute="Normal Text" lineEndContext="#pop" name="SequenceExpression">
1398         <AnyChar attribute="Decimal" context="#stay" String="0123456789-+"/>
1399         <Detect2Chars attribute="Escape" context="#stay" char="." char1="."/>
1400         <DetectChar attribute="Escape" context="#pop" char="}"/>
1401       </context>
1402 
1403 <!-- ====== These are the contexts that can be branched to ======= -->
1404 
1405       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenOrSubShell">
1406         <RegExpr attribute="Keyword" context="#pop!SubShell" String="\((?=&arithmetic_as_subshell;)|" beginRegion="subshell"/>
1407         <Detect2Chars attribute="Keyword" context="#pop!ExprDblParen" char="(" char1="(" beginRegion="expression"/>
1408       </context>
1409       <!-- ExprDblParen consumes an expression started in command mode till )) -->
1410       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParen">
1411         <DetectSpaces attribute="Normal Text" context="#stay"/>
1412         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")" endRegion="expression"/>
1413         <IncludeRules context="FindExprDblParen"/>
1414         <!-- ((cmd
1415               ) # jump to SubShell context -->
1416         <DetectChar attribute="Keyword" context="#pop!SubShell" char=")" endRegion="expression" beginRegion="subshell"/>
1417       </context>
1418       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprDblParen">
1419         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="&amp;"/>
1420         <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
1421         <AnyChar attribute="Operator" context="#stay" String="+-!~*/%&lt;>=&amp;^|?:"/>
1422         <AnyChar context="Number" String="0123456789" lookAhead="1"/>
1423         <DetectChar attribute="Control" context="#stay" char=","/>
1424         <DetectChar attribute="Normal Text" context="ExprSubDblParen" char="("/>
1425         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1426         <IncludeRules context="FindWord"/>
1427         <DetectChar attribute="Error" context="#stay" char="#"/>
1428         <DetectChar context="MaybeArithmeticBrace" char="{" lookAhead="1"/>
1429         <DetectIdentifier attribute="Variable" context="#stay"/>
1430       </context>
1431       <context attribute="Normal Text" lineEndContext="#stay" name="ExprSubDblParen">
1432         <DetectSpaces attribute="Normal Text" context="#stay"/>
1433         <DetectChar attribute="Normal Text" context="#pop" char=")"/>
1434         <IncludeRules context="FindExprDblParen"/>
1435       </context>
1436       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeArithmeticBrace">
1437         <IncludeRules context="DispatchBraceExpansion"/>
1438         <DetectChar attribute="Error" context="#pop" char="{"/>
1439       </context>
1440 
1441       <context attribute="Decimal" lineEndContext="#pop" name="Number">
1442         <HlCHex attribute="Hex" context="#pop" additionalDeliminator="&weakDeliminatorSymbols;"/>
1443         <HlCOct attribute="Octal" context="#pop!NumberError" additionalDeliminator="&weakDeliminatorSymbols;"/>
1444         <RegExpr attribute="Base" context="#pop!BaseN" String="[1-9][0-9]*#"/>
1445         <DetectChar attribute="Decimal" context="#pop!NumberError" char="0"/>
1446         <Int attribute="Decimal" context="#pop" additionalDeliminator="&weakDeliminatorSymbols;"/>
1447       </context>
1448       <context attribute="BaseN" lineEndContext="#pop" name="BaseN" fallthroughContext="#pop">
1449         <RegExpr attribute="BaseN" context="#pop" String="[0-9a-zA-Z@_]+"/>
1450       </context>
1451       <context attribute="Error" lineEndContext="#pop" name="NumberError" fallthroughContext="#pop">
1452         <Int attribute="Error" context="#pop" additionalDeliminator="0123456789"/>
1453       </context>
1454 
1455       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubstOrSubstCommand">
1456         <RegExpr attribute="Parameter Expansion" context="#pop!SubstCommand" String="\$\((?=&arithmetic_as_subshell;)|" beginRegion="subshell"/>
1457         <StringDetect attribute="Parameter Expansion" context="#pop!ExprDblParenSubst" String="$((" beginRegion="expression"/>
1458       </context>
1459       <!-- ExprDblParenSubst like ExprDblParen but matches )) as Variable -->
1460       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubst">
1461         <DetectSpaces attribute="Normal Text" context="#stay"/>
1462         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=")" char1=")" endRegion="expression"/>
1463         <IncludeRules context="FindExprDblParen"/>
1464         <!-- $((cmd
1465               ) # jump to SubstCommand context -->
1466         <DetectChar attribute="Parameter Expansion" context="#pop!SubstCommand" char=")" endRegion="expression" beginRegion="subshell"/>
1467       </context>
1468 
1469       <!-- ExprBracket consumes an expression till ] -->
1470       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracket" fallthroughContext="#pop!ExprBracketNot">
1471         <DetectSpaces attribute="Normal Text" context="#stay"/>
1472         <IncludeRules context="FindExprBracketEnd"/>
1473       </context>
1474 
1475       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketNot" fallthroughContext="#pop!ExprBracketParam1">
1476         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam1"/>
1477         <Detect2Chars attribute="Expression" context="ExprBracketTestMaybeNot" char="!" char1=" " lookAhead="1"/>
1478         <Detect2Chars attribute="Expression" context="ExprBracketTestMaybeNot" char="!" char1="&tab;" lookAhead="1"/>
1479       </context>
1480       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketTestMaybeNot">
1481         <DetectChar attribute="Expression" context="#pop" char="!"/>
1482       </context>
1483 
1484       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketParam1" fallthroughContext="ExprBracketValue">
1485         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam2"/>
1486         <DetectChar context="TestMaybeUnary" char="-" lookAhead="1"/>
1487         <IncludeRules context="FindExprBracketEnd"/>
1488       </context>
1489 
1490       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValue">
1491         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1492         <AnyChar context="#pop" String=" &tab;" lookAhead="1"/>
1493         <IncludeRules context="FindWord"/>
1494         <DetectChar context="NormalMaybeBraceExpansion" char="{" lookAhead="1"/>
1495         <IncludeRules context="FindNormalText"/>
1496       </context>
1497 
1498       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketParam2" fallthroughContext="ExprBracketValue">
1499         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam3"/>
1500         <AnyChar context="TestMaybeBinary" String="-=!" lookAhead="1"/>
1501         <IncludeRules context="FindExprBracketEnd"/>
1502       </context>
1503 
1504       <context attribute="Normal Text" lineEndContext="ExprBracketFinal" name="ExprBracketParam3" fallthroughContext="ExprBracketValue">
1505         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketFinal"/>
1506         <IncludeRules context="FindExprBracketEnd"/>
1507       </context>
1508 
1509       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketFinal" fallthroughContext="ExprBracketValue">
1510         <DetectSpaces attribute="Normal Text" context="#stay"/>
1511         <IncludeRules context="FindExprBracketEnd"/>
1512         <RegExpr attribute="Expression" context="#pop!ExprBracket" String="-[ao]&eos;"/>
1513         <RegExpr attribute="Error" context="#pop" String="(?:[^] &tab;]++|\][^ &tab;])++" endRegion="expression"/>
1514       </context>
1515 
1516       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprBracketEnd">
1517         <LineContinue attribute="Escape" context="#stay"/>
1518         <RegExpr attribute="Builtin" context="#pop" String="\](?=($|[ &tab;;|&amp;&lt;>)]))" endRegion="expression"/>
1519       </context>
1520 
1521       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeUnary" fallthroughContext="#pop!ExprBracketValue">
1522         <RegExpr attribute="Expression" context="#pop#pop!ExprBracketParam2" String="&unary_operators;"/>
1523       </context>
1524       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeBinary" fallthroughContext="#pop!ExprBracketValue">
1525         <RegExpr attribute="Expression" context="#pop" String="&binary_operators;"/>
1526       </context>
1527 
1528 
1529       <!-- ExprDblBracket consumes an expression till ]] -->
1530       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracket" fallthroughContext="#pop!ExprDblBracketNot">
1531         <DetectSpaces attribute="Normal Text" context="#stay"/>
1532         <DetectChar attribute="Comment" context="Comment" char="#"/>
1533         <IncludeRules context="FindExprDblBracketEnd"/>
1534       </context>
1535 
1536       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketNot" fallthroughContext="#pop!ExprDblBracketParam1">
1537         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam1"/>
1538         <DetectChar context="ExprDblBracketTestMaybeNot" char="!" lookAhead="1"/>
1539       </context>
1540       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketTestMaybeNot" fallthroughContext="#pop#pop!ExprDblBracketParam1">
1541         <RegExpr attribute="Expression" context="#pop" String="!(?=$|[ &tab;(])"/>
1542       </context>
1543 
1544       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam1" fallthroughContext="ExprDblBracketValueText">
1545         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam2"/>
1546         <DetectChar context="TestMaybeUnary2" char="-" lookAhead="1"/>
1547         <AnyChar attribute="Expression" context="#pop!ExprDblBracketParam3Spe" String="&lt;>"/>
1548         <IncludeRules context="FindExprDblBracketEnd"/>
1549       </context>
1550       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeUnary2" fallthroughContext="#pop!ExprDblBracketValueText">
1551         <RegExpr attribute="Expression" context="#pop!ExprDblBracketUnary" String="&unary_operators;(?!\s+(?:=~|&binary_operators;))"/>
1552       </context>
1553       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketUnary">
1554         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketValueText"/>
1555       </context>
1556 
1557       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueText" fallthroughContext="#pop!ExprDblBracketValueText2">
1558         <Detect2Chars context="#pop!ExprDblBracketValueTextMaybeEnd" char="]" char1="]" lookAhead="1"/>
1559         <DetectChar attribute="Error" context="#pop!Comment" char="#"/>
1560         <IncludeRules context="FindExprDblBracketValueTextPath"/>
1561       </context>
1562       <context attribute="Normal Text" lineEndContext="#pop" name="FindExprDblBracketValueTextPath">
1563         <RegExpr context="#pop!ExprDblBracketValueTextPath" String="&path_with_sep;|" lookAhead="1"/>
1564       </context>
1565       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueTextMaybeEnd">
1566         <RegExpr attribute="Keyword" context="#pop#pop" String="&dblbracket_close;" endRegion="expression"/>
1567         <IncludeRules context="FindExprDblBracketValueTextPath"/>
1568         <Detect2Chars context="#pop!ExprDblBracketValueText2" char="]" char1="]" lookAhead="1"/>
1569       </context>
1570       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueText2">
1571         <DetectIdentifier/>
1572         <AnyChar String="*?+!@~^:%+-/,"/>
1573         <IncludeRules context="ExprDblBracketValueCommon"/>
1574       </context>
1575       <context attribute="Path" lineEndContext="#pop" name="ExprDblBracketValueTextPath">
1576         <IncludeRules context="ExprDblBracketValueText2"/>
1577       </context>
1578 
1579       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePattern" fallthroughContext="#pop!ExprDblBracketValuePattern2">
1580         <RegExpr context="PathThenPop" String="&path_with_sep;|" lookAhead="1"/>
1581       </context>
1582       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePattern2">
1583         <DetectIdentifier attribute="Normal Text"/>
1584         <IncludeRules context="ExprDblBracketValueCommon"/>
1585         <IncludeRules context="FindExprDblBracketValueExtGlob"/>
1586         <AnyChar attribute="Glob" String="?*"/>
1587       </context>
1588       <context attribute="Glob" lineEndContext="#stay" name="FindExprDblBracketValueExtGlob">
1589         <Detect2Chars attribute="Glob" context="ExprDblBracketValueExtGlob" char="?" char1="("/>
1590         <Detect2Chars attribute="Glob" context="ExprDblBracketValueExtGlob" char="*" char1="("/>
1591         <Detect2Chars attribute="Glob" context="ExprDblBracketValueExtGlob" char="+" char1="("/>
1592         <Detect2Chars attribute="Glob" context="ExprDblBracketValueExtGlob" char="@" char1="("/>
1593         <Detect2Chars attribute="Glob" context="ExprDblBracketValueExtGlob" char="!" char1="("/>
1594         <DetectChar context="ExprDblBracketValueMaybeGlobAny" char="[" lookAhead="1"/>
1595       </context>
1596       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketValueMaybeGlobAny" fallthroughContext="#pop">
1597         <IncludeRules context="FindGlobAny"/>
1598         <DetectChar attribute="Normal Text" context="#pop" char="["/>
1599       </context>
1600       <context attribute="Normal Text" lineEndContext="#pop#pop" name="ExprDblBracketValueExtGlob">
1601         <DetectIdentifier attribute="Normal Text"/>
1602         <DetectChar attribute="Glob" context="#pop" char=")"/>
1603         <DetectChar attribute="Normal Text" context="ExprDblBracketValueExtGlobNormal" char="("/>
1604         <IncludeRules context="FindExprDblBracketValueExtGlob"/>
1605         <AnyChar attribute="Glob" String="|?*"/>
1606         <IncludeRules context="FindWord"/>
1607       </context>
1608       <context attribute="Normal Text" lineEndContext="#pop#pop" name="ExprDblBracketValueExtGlobNormal">
1609         <DetectIdentifier attribute="Normal Text"/>
1610         <DetectChar attribute="Normal Text" context="#pop" char=")"/>
1611         <DetectChar attribute="Normal Text" context="ExprDblBracketValueExtGlobNormal" char="("/>
1612         <IncludeRules context="FindExprDblBracketValueExtGlob"/>
1613         <AnyChar attribute="Glob" String="?*"/>
1614         <IncludeRules context="FindWord"/>
1615       </context>
1616 
1617       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueCommon">
1618         <Detect2Chars context="ExprDblBracketDblParentOrSubValue" char="(" char1="(" lookAhead="1"/>
1619         <DetectChar context="ExprDblBracketSubValue" char="(" lookAhead="1"/>
1620         <DetectChar attribute="Operator" context="#pop#pop" char=")"/>
1621         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1622         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="|" char1="|"/>
1623         <AnyChar attribute="Error" context="#stay" String="|&amp;;"/>
1624         <AnyChar context="#pop" String=" &tab;&lt;>" lookAhead="1"/>
1625         <IncludeRules context="FindWord"/>
1626       </context>
1627       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketSubValue" fallthroughContext="#pop">
1628         <DetectChar attribute="Operator" context="ExprDblBracketNot" char="("/>
1629         <Detect2Chars context="#pop#pop" char="]" char1="]" lookAhead="1"/>
1630       </context>
1631       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketDblParentOrSubValue">
1632         <RegExpr context="#pop!ExprDblBracketSubValue" String="\((?=&arithmetic_as_subshell;)|" lookAhead="1"/>
1633         <Detect2Chars attribute="Keyword" context="#pop!ExprDblBracketExprDblParen" char="(" char1="(" beginRegion="expression"/>
1634       </context>
1635       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketExprDblParen">
1636         <DetectSpaces attribute="Normal Text" context="#stay"/>
1637         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")" endRegion="expression"/>
1638         <IncludeRules context="FindExprDblParen"/>
1639         <!-- ((cmd
1640               ) # jump to ExprDblBracketValuePattern context -->
1641         <DetectChar attribute="Operator" context="ExprDblBracketValuePattern" char=")" endRegion="expression" beginRegion="subshell"/>
1642       </context>
1643 
1644       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam2" fallthroughContext="ExprDblBracketValuePattern">
1645         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam3"/>
1646         <AnyChar context="TestMaybeBinary2" String="-=!" lookAhead="1"/>
1647         <AnyChar attribute="Expression" context="#pop!ExprDblBracketParam3Spe" String="&lt;>"/>
1648         <IncludeRules context="FindExprDblBracketEnd"/>
1649         <DetectChar attribute="Comment" context="Comment" char="#"/>
1650       </context>
1651       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeBinary2" fallthroughContext="#pop!ExprDblBracketValuePattern">
1652         <IncludeRules context="TestMaybeBinary"/>
1653         <RegExpr attribute="Expression" context="#pop!ExprDblBracketRegex" String="=~(?=[ &tab;(])"/>
1654       </context>
1655 
1656       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam3Spe" fallthroughContext="#pop!ExprDblBracketParam3">
1657         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam3"/>
1658       </context>
1659 
1660       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam3" fallthroughContext="ExprDblBracketValuePattern">
1661         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketFinal"/>
1662         <IncludeRules context="FindExprDblBracketEnd"/>
1663         <AnyChar attribute="Error" context="#stay" String="&lt;>"/>
1664         <DetectChar attribute="Comment" context="Comment" char="#"/>
1665       </context>
1666 
1667       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketFinal" fallthroughContext="ExprDblBracketValuePattern">
1668         <DetectSpaces attribute="Normal Text" context="#stay"/>
1669         <IncludeRules context="FindExprDblBracketEnd"/>
1670         <DetectChar attribute="Comment" context="Comment" char="#"/>
1671         <DetectChar attribute="Operator" context="#pop" char=")"/>
1672         <RegExpr attribute="Error" context="#pop" String="(?:[^] &tab;]++|\](?:[^]]|\][^ &tab;]))++" endRegion="expression"/>
1673       </context>
1674 
1675       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprDblBracketEnd">
1676         <LineContinue attribute="Escape" context="#stay"/>
1677         <Detect2Chars attribute="Control" context="#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1678         <Detect2Chars attribute="Control" context="#pop!ExprDblBracket" char="|" char1="|"/>
1679         <RegExpr attribute="Keyword" context="#pop" String="&dblbracket_close;" endRegion="expression"/>
1680       </context>
1681 
1682       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketRegex" fallthroughContext="#pop!ExprDblBracketRegexCheck">
1683         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketRegexCheck"/>
1684       </context>
1685       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketRegexCheck" fallthroughContext="#pop#pop!Regex">
1686         <DetectChar attribute="Error" context="Comment" char="#"/>
1687       </context>
1688       <context attribute="Pattern" lineEndContext="#stay" name="Regex">
1689         <DetectIdentifier attribute="Pattern"/>
1690         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketFinal"/>
1691         <DetectChar attribute="Operator" context="#pop" char=")"/>
1692         <Detect2Chars attribute="Operator" context="RegexChar" char="[" char1="^"/>
1693         <DetectChar attribute="Operator" context="RegexChar" char="["/>
1694         <IncludeRules context="FindRegex"/>
1695       </context>
1696       <context attribute="Pattern" lineEndContext="#stay" name="ExprDblBracketSubRegex">
1697         <DetectIdentifier attribute="Pattern"/>
1698         <DetectSpaces attribute="Pattern" context="#stay"/>
1699         <DetectChar attribute="Operator" context="#pop" char=")"/>
1700         <Detect2Chars attribute="Operator" context="RegexSubChar" char="[" char1="^"/>
1701         <DetectChar attribute="Operator" context="RegexSubChar" char="["/>
1702         <IncludeRules context="FindRegex"/>
1703       </context>
1704 
1705       <context attribute="Pattern" lineEndContext="#stay" name="FindRegex">
1706         <DetectChar attribute="Operator" context="ExprDblBracketSubRegex" char="("/>
1707         <DetectChar attribute="Escape" context="RegexEscape" char="\"/>
1708         <DetectChar attribute="Parameter Expansion" context="RegexDup" char="{"/>
1709         <AnyChar attribute="Glob" context="#stay" String="^?+*.|"/>
1710         <IncludeRules context="FindStrings"/>
1711         <DetectChar context="RegexDispatchVariables" char="$" lookAhead="1"/>
1712         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1713       </context>
1714       <context attribute="Normal Text" lineEndContext="#stay" name="RegexDispatchVariables">
1715         <IncludeRules context="DispatchVariables"/>
1716         <DetectChar attribute="Operator" context="#pop" char="$"/>
1717       </context>
1718 
1719       <context attribute="Normal Text" lineEndContext="#pop" name="RegexEscape">
1720         <RegExpr attribute="Escape" context="#pop" String="x[0-9a-fA-F]{1,2}|[0-7]{1,3}|."/>
1721       </context>
1722 
1723       <context attribute="Normal Text" lineEndContext="#pop" name="RegexDup">
1724         <Int attribute="Decimal" additionalDeliminator="{"/>
1725         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=","/>
1726         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1727       </context>
1728 
1729       <context attribute="Pattern" lineEndContext="#pop" name="RegexSubChar" fallthroughContext="#pop!RegexSubInChar">
1730         <AnyChar attribute="Pattern" context="#pop!RegexSubInChar" String="-]"/>
1731       </context>
1732       <context attribute="Pattern" lineEndContext="#pop" name="RegexSubInChar">
1733         <DetectSpaces attribute="Pattern" context="#stay"/>
1734         <IncludeRules context="RegexInChar"/>
1735       </context>
1736 
1737       <context attribute="Pattern" lineEndContext="#pop" name="RegexChar" fallthroughContext="#pop!RegexInChar">
1738         <AnyChar attribute="Pattern" context="#pop!RegexInChar" String="-]"/>
1739       </context>
1740       <context attribute="Pattern" lineEndContext="#pop" name="RegexInChar">
1741         <Detect2Chars context="RegexInCharEnd" char="-" char1="]" lookAhead="1"/>
1742         <DetectChar attribute="Operator" context="#stay" char="-"/>
1743         <DetectChar attribute="Escape" context="RegexEscape" char="\"/>
1744         <DetectChar context="RegexCharClassSelect" char="[" lookAhead="1"/>
1745         <DetectChar attribute="Operator" context="#pop" char="]"/>
1746         <AnyChar context="#pop" String="() &tab;" lookAhead="1"/>
1747         <IncludeRules context="FindStrings"/>
1748       </context>
1749       <context attribute="Operator" lineEndContext="#stay" name="RegexInCharEnd">
1750         <DetectChar attribute="Pattern" context="#stay" char="-"/>
1751         <DetectChar attribute="Operator" context="#pop#pop" char="]"/>
1752       </context>
1753       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCharClassSelect">
1754         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexCharClass" char="[" char1=":"/>
1755         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexCollatingSymbols" char="[" char1="."/>
1756         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexEquivalenceClass" char="[" char1="="/>
1757         <DetectChar attribute="Pattern" context="#pop" char="["/>
1758       </context>
1759 
1760       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCharClass">
1761         <DetectIdentifier attribute="Parameter Expansion"/>
1762         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char=":" char1="]"/>
1763         <DetectChar attribute="Error" context="#pop" char="]"/>
1764       </context>
1765       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCollatingSymbols">
1766         <DetectIdentifier attribute="Parameter Expansion"/>
1767         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char="." char1="]"/>
1768         <DetectChar attribute="Error" context="#pop" char="]"/>
1769       </context>
1770       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexEquivalenceClass">
1771         <DetectIdentifier attribute="Parameter Expansion"/>
1772         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char="=" char1="]"/>
1773         <DetectChar attribute="Error" context="#pop" char="]"/>
1774       </context>
1775 
1776       <!-- SubShell consumes shell input till ) -->
1777       <context attribute="Normal Text" lineEndContext="#stay" name="SubShell" fallthroughContext="Command">
1778         <DetectChar attribute="Keyword" context="#pop" char=")" endRegion="subshell"/>
1779         <IncludeRules context="Start"/>
1780       </context>
1781 
1782       <!-- Assign consumes an expression till EOL or whitespace -->
1783       <context attribute="Normal Text" lineEndContext="#pop" name="Assign" fallthroughContext="#pop!Assign2">
1784         <DetectChar attribute="Variable" context="#pop!AssignArray" char="("/>
1785       </context>
1786       <context attribute="Normal Text" lineEndContext="#pop" name="Assign2" fallthroughContext="#pop">
1787         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1788         <IncludeRules context="NormalOption"/>
1789       </context>
1790 
1791       <!-- AssignArray consumes everything till ), marking assignments -->
1792       <context attribute="Normal Text" lineEndContext="#stay" name="AssignArray" fallthroughContext="NormalOption">
1793         <DetectSpaces attribute="Normal Text" context="#stay"/>
1794         <DetectChar attribute="Comment" context="Comment" char="#"/>
1795         <DetectChar attribute="Variable" context="#pop!Assign2" char=")"/>
1796         <DetectChar context="AssignArrayKey" char="[" lookAhead="1"/>
1797         <DetectChar attribute="Backquote" context="AssignArrayBackq" char="`"/>
1798         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1799       </context>
1800       <context attribute="Normal Text" lineEndContext="#pop" name="AssignArrayKey" fallthroughContext="#pop">
1801         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1802         <DetectChar attribute="Variable" context="#pop" char="="/>
1803       </context>
1804       <context attribute="Normal Text" lineEndContext="#stay" name="AssignArrayBackq" fallthroughContext="Command">
1805         <DetectChar attribute="Backquote" context="#pop!NormalOption" char="`"/>
1806         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
1807         <IncludeRules context="Start"/>
1808       </context>
1809 
1810       <!-- Subscript consumes anything till ], marks as Variable -->
1811       <context attribute="Normal Text" lineEndContext="#stay" name="Subscript" fallthroughContext="#pop!Subscript2">
1812         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1813         <AnyChar attribute="Decimal" context="#stay" String="0123456789"/>
1814       </context>
1815       <context attribute="Normal Text" lineEndContext="#stay" name="Subscript2">
1816         <DetectIdentifier attribute="Normal Text"/>
1817         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1818         <IncludeRules context="FindWord"/>
1819         <IncludeRules context="FindPattern"/>
1820       </context>
1821 
1822       <!-- FunctionDef consumes a name, possibly with (), marks as Function -->
1823       <context attribute="Function" lineEndContext="#pop" name="FunctionDef" fallthroughContext="#pop">
1824         <RegExpr attribute="Function" context="#pop" String="[ &tab;]+&funcname;(?:[ &tab;]*\(\))?"/>
1825       </context>
1826 
1827       <!-- Case is called after the case keyword is encoutered. We handle this because of
1828            the lonely closing parentheses that would otherwise disturb the expr matching -->
1829       <context attribute="Normal Text" lineEndContext="#stay" name="Case">
1830         <DetectSpaces attribute="Normal Text" context="#stay"/>
1831         <WordDetect attribute="Keyword" context="#pop!CaseIn" String="in"/>
1832         <IncludeRules context="FindWord"/>
1833         <DetectIdentifier attribute="Normal Text" context="#stay"/>
1834       </context>
1835 
1836       <!-- CaseIn is called when the construct 'case ... in' has been found. -->
1837       <context attribute="Normal Text" lineEndContext="#stay" name="CaseIn" fallthroughContext="CasePattern">
1838         <DetectSpaces attribute="Normal Text" context="#stay"/>
1839         <DetectChar attribute="Keyword" context="CasePattern" char="("/>
1840         <DetectChar attribute="Comment" context="Comment" char="#"/>
1841       </context>
1842       <context attribute="Pattern" lineEndContext="#stay" name="CasePattern">
1843         <DetectSpaces attribute="Normal Text" context="#stay"/>
1844         <DetectChar attribute="Keyword" context="#pop!CaseExpr" char=")" beginRegion="caseexpr"/>
1845         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1846         <DetectChar attribute="Keyword" context="#stay" char="|"/>
1847         <IncludeRules context="FindWord"/>
1848         <IncludeRules context="FindPattern"/>
1849         <WordDetect attribute="Control Flow" context="#pop#pop" String="esac" endRegion="case"/>
1850         <DetectIdentifier attribute="Pattern" context="#stay"/>
1851       </context>
1852 
1853       <!-- CaseExpr eats shell input till ;; / ;& / ;;& -->
1854       <context attribute="Normal Text" lineEndContext="#stay" name="CaseExpr" fallthroughContext="Command">
1855         <StringDetect attribute="Control Flow" context="#pop" String=";;&amp;" endRegion="caseexpr"/>
1856         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1=";" endRegion="caseexpr"/>
1857         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1="&amp;" endRegion="caseexpr"/>
1858         <WordDetect context="#pop" String="esac" endRegion="caseexpr" lookAhead="1"/>
1859         <IncludeRules context="Start"/>
1860       </context>
1861 
1862     </contexts>
1863 
1864     <itemDatas>
1865       <itemData name="Normal Text"    defStyleNum="dsNormal"/>
1866       <itemData name="Comment"        defStyleNum="dsComment"/>
1867       <itemData name="Keyword"        defStyleNum="dsKeyword"       spellChecking="false"/>
1868       <itemData name="Control"        defStyleNum="dsKeyword"       spellChecking="false"/>
1869       <itemData name="Control Flow"   defStyleNum="dsControlFlow"   spellChecking="false"/>
1870       <itemData name="Builtin"        defStyleNum="dsBuiltIn"       spellChecking="false"/>
1871       <itemData name="Command"        defStyleNum="dsFunction"      spellChecking="false"/>
1872       <itemData name="OtherCommand"   defStyleNum="dsExtension"     spellChecking="false"/>
1873       <itemData name="Redirection"    defStyleNum="dsOperator"      spellChecking="false"/>
1874       <itemData name="Escape"         defStyleNum="dsDataType"      spellChecking="false"/>
1875       <itemData name="String SingleQ" defStyleNum="dsString"/>
1876       <itemData name="String DoubleQ" defStyleNum="dsString"/>
1877       <itemData name="Here Doc"       defStyleNum="dsString"/>
1878       <itemData name="Backquote"      defStyleNum="dsKeyword"       spellChecking="false"/>
1879       <itemData name="String Transl." defStyleNum="dsString"/>
1880       <itemData name="String Escape"  defStyleNum="dsDataType"/>
1881       <itemData name="Variable"       defStyleNum="dsVariable"      spellChecking="false"/>
1882       <itemData name="Dollar Prefix"  defStyleNum="dsVariable"      spellChecking="false"/>
1883       <itemData name="Expression"     defStyleNum="dsOthers"        spellChecking="false"/>
1884       <itemData name="Function"       defStyleNum="dsFunction"      spellChecking="false"/>
1885       <itemData name="Pattern"        defStyleNum="dsSpecialString" spellChecking="false"/>
1886       <itemData name="Path"           defStyleNum="dsNormal"        spellChecking="false"/>
1887       <itemData name="Glob"           defStyleNum="dsPreprocessor"  spellChecking="false"/>
1888       <itemData name="Option"         defStyleNum="dsAttribute"     spellChecking="false"/>
1889       <itemData name="Hex"            defStyleNum="dsBaseN"         spellChecking="false"/>
1890       <itemData name="Octal"          defStyleNum="dsBaseN"         spellChecking="false"/>
1891       <itemData name="Decimal"        defStyleNum="dsDecVal"        spellChecking="false"/>
1892       <itemData name="Base"           defStyleNum="dsDataType"      spellChecking="false"/>
1893       <itemData name="BaseN"          defStyleNum="dsBaseN"         spellChecking="false"/>
1894       <itemData name="File Descriptor" defStyleNum="dsDecVal"       spellChecking="false"/>
1895       <itemData name="Parameter Expansion" defStyleNum="dsVariable" spellChecking="false"/>
1896       <itemData name="Parameter Expansion Operator" defStyleNum="dsOperator" spellChecking="false"/>
1897       <itemData name="Operator"       defStyleNum="dsOperator"      spellChecking="false"/>
1898       <itemData name="Error"          defStyleNum="dsError"         spellChecking="false"/>
1899       <itemData name="Region Marker"  defStyleNum="dsRegionMarker"  spellChecking="false" />
1900     </itemDatas>
1901   </highlighting>
1902   <general>
1903     <comments>
1904       <comment name="singleLine" start="#"/>
1905     </comments>
1906     <keywords casesensitive="1" weakDeliminator="_&weakDeliminatorSymbols;" additionalDeliminator="`"/>
1907   </general>
1908 </language>