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 "	">
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;<>|&;)])">
0009
0010 <!ENTITY substseps "${'"`\\">
0011 <!ENTITY symbolseps "<>|&;()"> <!-- see man bash -->
0012 <!ENTITY wordseps " &tab;&symbolseps;"> <!-- see man bash -->
0013
0014 <!ENTITY bq_string "`[^`]*+`">
0015 <!ENTITY sq_string "'[^']*+'">
0016 <!ENTITY dq_string ""(?:[^"\\`]*+|&bq_string;|\\.)*+"">
0017 <!ENTITY strings "(?:&sq_string;|&dq_string;|&bq_string;)">
0018
0019 <!ENTITY globany "\[(?:[^&wordseps;"'`\\\[\]]+|\\.|&strings;|\[:\w+:\]|\[)*\]">
0020
0021 <!ENTITY next_is_globany "(?:\^?\]\]|(?:\^?\]?)?(?:\\.|[^'" &tab;<>|&;()\\[\]]+|&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;'"`\\/]">
0040 <!ENTITY path_with_sep_text2 "[^?*+!@()'"`\\/]">
0041 <!ENTITY path_with_sep_expr "\\.|&strings;|&globany;|[?*+](?!\()">
0042 <!ENTITY path_with_sep_spe "(~|\.\.?)($|[/ &tab;<>|&;)])">
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;<>|&;{}\\`'"$">
0047 <!ENTITY _brace_noexpansion "\{[^&_braceexpansion_spe;,]*+\}">
0048 <!ENTITY _braceexpansion_var "\$(?:\{[^\[\]&_braceexpansion_spe;]*+(?:\[[*@a-zA-Z0-9]\])\})?">
0049 <!ENTITY _braceexpansion_string "'[^']*'|"([^"\`]*+|`[^`]*`)*+"">
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 "(?|"([^"]+)"|'([^']+)'|\\(.[^&wordseps;&substseps;]*))">
0056
0057 <!ENTITY arithmetic_as_subshell "\(((?:[^`'"()$]++|\$\{[^`'"(){}$]+\}|\$(?=[^{`'"()])|`[^`]*+`|\((?1)(?:[)]|(?=['"])))++)(?:[)](?=$|[^)])|["'])">
0058
0059 <!ENTITY unary_operators "-[abcdefghkprstuwxGLNOSovRnz]&eos;">
0060 <!ENTITY binary_operators "(?:-(?:e[fq]|[nolg]t|[nlg]e)|==?|!=)&eos;">
0061
0062 <!ENTITY dblbracket_close "\]\](?=($|[ &tab;;|&)]))">
0063
0064 <!ENTITY weakDeliminatorSymbols "^%#[]$.{}:-/">
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="&>>"/>
0565 <Detect2Chars attribute="Redirection" context="FdRedirection" char="&" char1=">"/>
0566
0567 <!-- handle branche conditions -->
0568 <Detect2Chars attribute="Control" context="#stay" char="&" char1="&"/>
0569 <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
0570
0571 <!-- handle &, |, ; -->
0572 <AnyChar attribute="Control" context="#stay" String="&|;"/>
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;]+<<[ &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="<>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;'|"(\$?&varname;|\$\{&varname;\}|[a-zA-Z0-9_])+")+(?=\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="""/>
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="&" char1="&"/>
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="&<>" 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="&>>"/>
0718 <Detect2Chars attribute="Redirection" context="FdRedirection" char="&" char1=">"/>
0719
0720 <!-- handle &, |, ;, ` -->
0721 <AnyChar context="#pop" String="&|;`" lookAhead="1"/>
0722
0723 <!-- handle redirection -->
0724 <AnyChar context="CommandArgMaybeRedirection" String="<>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]++(?=[<>])"/>
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="&"/>
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="<<<"/>
0999 <!-- handle here document -->
1000 <Detect2Chars context="#pop!HereDoc" char="<" char1="<" lookAhead="1"/>
1001 <!-- handle input redirection -->
1002 <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char="<" char1="&"/>
1003 <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char="<" char1=">"/>
1004 <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char="<" char1="("/>
1005 <DetectChar attribute="Redirection" context="#pop!WordRedirection" char="<"/>
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;]*<<[ &tab;]*'#([^']+)'$" column="0"/>
1039 <RegExpr attribute="Redirection" context="HereDocIQ" String="<<-[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
1040 <RegExpr attribute="Redirection" context="HereDocINQ" String="<<-[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
1041 <RegExpr attribute="Redirection" context="HereDocQ" String="<<[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
1042 <RegExpr attribute="Redirection" context="HereDocNQ" String="<<[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
1043
1044 <RegExpr context="HereDocIQCmd" String="(<<-[ &tab;]*&heredocq;)" lookAhead="1"/>
1045 <RegExpr context="HereDocINQCmd" String="(<<-[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
1046 <RegExpr context="HereDocQCmd" String="(<<[ &tab;]*&heredocq;)" lookAhead="1"/>
1047 <RegExpr context="HereDocNQCmd" String="(<<[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
1048
1049 <Detect2Chars attribute="Redirection" context="#pop" char="<" char1="<"/><!-- always met -->
1050 </context>
1051
1052 <context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder" fallthroughContext="CommandArg">
1053 <AnyChar context="BashOneLine" String="&|;`" 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="<<[ &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="""/>
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="""/>
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="""/>
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="&" char1="&"/>
1420 <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
1421 <AnyChar attribute="Operator" context="#stay" String="+-!~*/%<>=&^|?:"/>
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;;|&<>)]))" 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="<>"/>
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="&" char1="&"/>
1622 <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="|" char1="|"/>
1623 <AnyChar attribute="Error" context="#stay" String="|&;"/>
1624 <AnyChar context="#pop" String=" &tab;<>" 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="<>"/>
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="<>"/>
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="&" char1="&"/>
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=";;&" endRegion="caseexpr"/>
1856 <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1=";" endRegion="caseexpr"/>
1857 <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1="&" 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>