highlight.sh

    #! /bin/sh
    # This is a test script for the Katepart Bash Syntax Highlighting by
    #	Wilbert Berendsen.  This is not runnable !!!

    # The highlighting recognizes basic types of input, and has a few special cases that
    # are all in FindCommands.  The main objective is to create really proper nesting of
    # (multiline) strings, variables, expressions, etc.

    # ============== Tests: ===============

    # basic types:
    echo 'single quoted string'
    echo "double quoted string"
    echo $'string with esc\apes\x0din it'
    echo $"string meant to be translated"
    echo "$"

    # comments:
    # this is a comment
    #this too
    echo this is#nt a comment
    dcop kate EditInterface#1 #this is
    grep -e "^default/linux/amd64/" |\ #this is not a comment but #this is
    mkdir this\ isnt\ #a\ comment
    mkdir this\ isnt\\\;#a\ comment
    mkdir this\\ #is a comment

    <<'#BLOCK-COMMENT'
    NOTE This is the "miltiline" comment.

    [===[.rst:

    Docs
    ----

    Documentation block in ``RST`` format **starts** *here*.

    ]===]
    #BLOCK-COMMENT

    : << '#SC2188'
    [====[.rst:
    The *multiline* comment does not trigger the SC2188_ warning of `shellcheck`.

    .. _SC2188: https://www.shellcheck.net/wiki/SC2188
    ]====]

    ... continue with _normal_ Bash comment.
    #SC2188

    # brace expansion
    mv my_file.{JPG,jpg}
    echo f.{01..100..3} f.{Z..a..-3}
    echo f.{01..100} f.{a..Z}
    # no brace expansion
    echo f.{..100} f.{1..Z} f.{a..Z..}

    # special characters are escaped:
    echo \(output\) \&\| \> \< \" \' \*

    # variable substitution:
    echo $filename.ext
    echo $filename_ext
    echo ${filename}_ext
    echo text${array[$subscript]}.text
    echo text${array["string"]}.text
    echo ${!prefix*}
    echo ${!redir} ${!3} ${!#} ${!##} ${!@###} ${!}
    echo short are $_, $$, $?, ${@}, etc.
    echo ${variable/a/d}
    echo ${1:-default}
    echo ${10} $10a # 9 is max

    # expression subst:
    echo $(( cd << ed + 1 ))

    # command subst:
    echo $(ls -l)
    echo `cat myfile`

    # command subst bash-5.3:
    v=${|ls;}
    v=${ ls -l }; }
    #          ^ ls parameter
    v="${ ls -l }; }"
    #           ^ ls parameter
    v=${
      ls -l
    }
    v="${
      ls -l
    }"

    # file subst:
    echo $(<$filename)
    echo $(</path/to/myfile)

    # process subst:
    sort <(show_labels) | sed 's/a/bg' > my_file.txt 2>&1

    # All substitutions also work in strings:
    echo "subst ${in}side string"  'not $inside this ofcourse'
    echo "The result is $(( $a + $b )). Thanks!"
    echo "Your homedir contains `ls $HOME |wc -l` files."

    # Escapes in strings:
    p="String \` with \$ escapes \" ";

    # keywords are black, builtins dark purple and common commands lighter purple
    set
    exit
    login

    # Other colorings:
    error() {
    	cat /usr/bin/lesspipe.sh
    	runscript >& redir.bak
    	exec 3>&4
    }

    # do - done make code blocks
    while [ $p -lt $q ]
    do
    	chown 0644 $file.$p
    done

    # braces as well
    run_prog | sort -u |
    {
    	echo Header
    	while read a b d
    	do
    		echo $a/$b/$c
    	done
    	echo Footer
    }

    # Any constructions can be nested:
    echo "A long string with $(
    	if [ $count -gt 100 ] ; then
    		echo "much"
    	else
    		echo "not much"
    	fi ) substitutions." ;

    # Even the case construct is correctly folded:
    test -f blaat &&
    (	do_something
    	case $p in
    		*bak)
    			do_bak $p
    			;;
    		*)
    			dont_bak $p
    			;;
    	esac
    ) # despite the extra parentheses in the case construction.

    # more control flow
    while :;
      break
      continue
      return
    done

    # variable assignments:
    DIR=/dev
    p=`ls`
    LC_ALL="nl" dcop 'kate*'
    _VAR=val
    ARR=(this is an array)
    ARR2=([this]=too [and]="this too")
    usage="$0 -- version $VERSION
    Multiple lines of output
    can be possible."
    ANSWER=yes	# here 'yes' isn't highlighed as command

    # Some commands expect variable names, these are colored correctly:
    export PATH=/my/bin:$PATH BLAAT
    export A B D
    local p=3  x  y='\'
    read x y z <<< $hallo
    unset B
    declare -a VAR1 VAR2 && exit
    declare less a && b
    declare a=(1 2)
    getopts :h:l::d arg
    read #comment
    let a=4+4 3+a b=c+3 d+3 d*4 # * is a glob

    # options are recoqnized:
    zip -f=file.zip
    ./configure  --destdir=/usr
    make  destdir=/usr/

    # [[ and [ correctly need spaces to be regarded as structure,
    # otherwise they are patterns (currently treated as normal text)
    if [ "$p" == "" ] ; then
    	ls /usr/bin/[a-z]*
    elif [[ $p == 0 ]] ; then
    	ls /usr/share/$p
    fi

    # Fixed:
    ls a[ab]*		# dont try to interprete as assignment with subscript (fixed)
    a[ab]
    a[ab]=sa

    # Here documents are difficult to catch:
    cat > myfile << __EOF__
    You're right, this is definitely no bash code
    But ls more $parameters should be expanded.
    __EOF__

    # quoted:
    cat << "EOF" | egrep "this" >&4   # the rest of the line is still considered bash source
    You're right, this is definitely no bash code
    But ls more $parameters should be expanded. :->
    EOF

    cat <<bla || exit
    bla bla
    bla

    # indented:
    if true
    then
    	cat <<- EOF
    		Indented text with a $dollar or \$two
    	EOF
    elif [ -d $file ]; then
    	cat <<- "EOF"
    		Indented text without a $dollar
    	EOF
    fi

    if ! { cmd1 && cmd2 ; }; then echo ok ; fi
    if ! cmd1 arg; then echo ok ; fi

    case 1 in
    2) echo xxx;
    ;;
    ?) foo || yyy ; foo abc || echo abc ;;
    1) echo yyy;
    esac

    ls #should be outside of case 1 folding block

    for i in `ls tests/auto/output/*.html`; do
        refFile=`echo $i | sed -e s,build,src, | sed -e s,output,reference, | sed -e s,.html,.ref.html,`
        cp -v $i $refFile
    done

    ## >Settings >Configure Kate >Fonts & Colors >Highlitghing Text Styles >Scripts/Bash >Option >Change colors to some distinct color
    ## 1- In following line the -ucode should not be colored as option

    pacman -Syu --needed intel-ucode grub
    pacman -syu --needed intel-ucode grub

    # Braces (bug ##387915)
    [[ $line_name =~ \{([0-9]{1,})\}\{([0-9]{1,})\}(.*) ]]
    [[ $name =~ (.*)_(S[0-9]{2})(E[0-9]{2,3}[a-z]{0,1})_(.*) ]]
    # Comments in Braces (bug 450878)
    [[ # comment 1
       1 == 1 # comment 2
       # comment 3
    ]]
    # Line continuation in Braces (bug 487978)
    [[ \
     x \
     = \
     "y" # bla bla
     ]]
    [ \
     x \
     = \
     "y" ]

    rm /data/{hello1,hello2}/input/{bye1,$bye2}/si{a,${b},c{k,p{e,a}}}/*.non
    rm /data/{aa,{e,i}t{b,c} # Not closed
    rm /data/{aa,{e,i}t{b,c}}
    rm /data/{aa,{i}}
    rm /data{aa{bb{cc{dd}}}}
    rm /data{aaa`aaa}aa`aaa}a

    ${array[0]: -7 : +  22  }  ${array[1]: num  }
    ${parameter##word} ${parameter%%word} ${parameter^^pattern} ${parameter,,pattern} ${parameter@operator}

    # TODO `

    # commands
    abc
    cp
    :
    .
    :#nokeyword
    path/cmd
    ec\
    ho
    2
    {ab}c
    {a,b}c
    'a'c
    $ab
    ${ab}c
    \ a
    !a
    {ab}[
    {a,b}[
    'a'[
    \ [
    !a[
    a{}d
    a{bc}d
    a{b,c}d
    a'b'c
    a$bc
    a${bc}d
    a\ b
    a!b
    a{}[
    a{bc}[
    a{b,c}[
    a'b'[
    a\ [
    a!b[

    # commands + params
    shortopt -ol -f/fd/fd -hfd/fds - -ol'a'b -f'a'/fd/fd -h'a'fd/fds
    longopt --long-a --long-b=value --file=* --file=file* --file=dir/file
    longopt --long-a'a'b --long'a'-b=value --fi'a'le=*
    noopt 3 3d -f -- -f --xx dir/file
    opt param#nocomment ab'a'cd [[ param ]] } { ~a .a #comments
    path path/file dir/ / // 3/f a@/ 'a'/b d/'a'b a\ d/f f/f\
    ile
    path ~ ~/ ~a/ . .. ./a ../a
    path /path/* /path/f* /path/f@ /path/f@(|) {a/b} a{b}/c a/b{c} a/{b} a/{b}c
    glob ? * ?f *f f* f? **/ ~/* ~* /path/f* 'a'* 'a'f/?
    extglob @ @(*) @(f*|f??(f)) f!(+(?(@(*(f)f)f)f)f)f @'a'@(|) a@(?)
    subs f! f!! f!s 'a'!s \( $v {a,b} {a} {a}/d {a\,} {a,} {a,\},b} ds/{a,b}sa/s
    2 - f -f
    !a -f
    'a' -f
    $a -f
    ! cmd

    # coproc command (#460301)
    coproc ls thisfiledoesntexist 2>&1
    coproc { ls thisfiledoesntexist; read; } 2>&1
    coproc mycoproc { awk '{print "foo" $0;fflush()}'; } >&3

    # redirections (prefix)
    <<<s cat
    <<<'s' cat
    <<<'s's cat
    <<<s's's cat
    <<<s${s}s cat
    <<< s${s}s cat
    >&2 cat
    <f cat
    < f cat
    2>3 cat
    2>&3 cat
    2>& 3 cat
    2>f cat
    &>f cat

    <<<# comment
    <# comment
    ># comment
    <<< # comment
    < # comment
    > # comment

    # redirections
    cat f>2
    cat d/f>2
    cat d/f >2
    cat d/f >& 2
    cat >2 d/f
    cat > 2
    cat <(echo) <(echo a) <(echo a/f) <(echo ) <(echo a ) <(echo a/f )
    cat 2>&1 &>f &>>f 2<&1- 2<>f 2<<heredoc
    bla bla
    heredoc
    <<-'h' cat
    bla
    h
    <<"'" cat
    bla
    '
    cat <<heredoc
    bla bla
    heredoc
    cat <<heredoc -a
    bla bla
    heredoc
    r=$(xxx $@ 2>&1)

    cat <<<# comment
    cat <# comment
    cat ># comment
    cat <<< # comment
    cat < # comment
    cat > # comment

    # branches
    cat a|cat
    cat a&cat
    cat a||cat
    cat a&&cat
    cat a;cat
    cat a | cat
    cat a & cat
    cat a || cat
    cat a && cat
    cat a ; cat
    cat a'a';cat

    # substitutions
    echo '' 'a' '\' "" "a" "\\" "$a" "a""a"'a''a' a'b'c a"b"c a$'\n'c
    echo a!bc a{a}b a{b,c}d a{b,{d,e}}d a\ b
    echo a$bc a$b/c a${b}c a$((b-3))c a$(b)c a$(a b c)c
    echo ${a[*]} ${a[@]} ${a[${b}]} ${a:-x$z} ${a-x} ${a/g} ${a//f/f} ${a//f*/f*} ${x/pat/a&b}
    echo ${a^^l*} ${a,} ${!a} ${#a[1]} ${a:1:$b} $((++i,i--))
    echo "${var#lo+(r)em}" x "${var#+(r)em}" x
    echo "${var#refs/heads}" x "${var#refs}" x

    [ a ]
    [ -f f'f'f ]
    [ -f f]'f'f] ]
    [ -t 13 ]
    [ -t 13] ]
    [ -t 13] ]
    [ -v abc ]
    [ -z abc ]
    [ abc -ef abc ]
    [ abc -ef abc ]
    [ abc-ef -ef abc-ef ]
    [ abc == abc ]
    [ abc < abc ]
    [ abc -eq abc ]
    [[ abc -eq abc ]]
    [ 1+2 -eq 1+2 ]
    [[ 1+2 -eq 1+2 ]]
    [ a = b c ]
    [[ a = b c ]]
    [ -z 1 -a 1 -eq 1 ]
    [ 2 -eq 1 -o 1 -eq 1 ]
    [[ x =~ a(b c|$)' '{1,}[a[.digit.]] ]]
    [[ x =~ [ ] ]]
    [[ x =~ ([ ]) ]]
    [[ x =~ [ ]]
    [[ x =~ ([) ]]
    [[ (a =~ a) ]]
    [[ a =~ a || a -eq 2 ]]
    [[ (a =~ a) || a -eq 2 ]]
    [[ (0 -le $b) ]]
    [[ ( 0 -le $b ) ]]
    [[ ( 0 -le $b || $b -le 100 ) ]]
    [[ a<b ]]
    [[ a <b ]]
    [[ a< b ]]
    [[ a < b ]]
    [[(! -d .)]]
    [[ ! -d . ]]
    [[ !(-d .) ]]
    [[ -f a || -f b ]]
    [[ -f a||-f b ]]
    [[ ! (a -eq b) ]]
    [ -d `echo .`] ]
    [[ -d `echo .`]] ]]
    [[ a != b && ${a}a = b${b} ]]
    [[
      1 -eq 2
    ]]
    [[ -&&- ]]
    [[ ]]
    [[ -f ]]
    [[ -f [0-9a] ]]
    [[ ?*[0-9] = [^0-9] ]]
    [[ -f = ?*[0-9] ]]
    [[ ?*[0-9] = ?*[0-9] ]]
    [[ a/sa[s = dsad?*[0-9]dsa$ds ]]
    [[ a/sa[s = dsad?*[0-9]ds/a$ds ]]
    [[ a =~ [12]a([!d]a?s[x[:alnum:]]|d?)p ]]

    [[ #comm1
     #comm2
     p[1] == p[2]
     #comm3
     #comm4
    ]]

    [[ #comm1
     #comm2
     -f p[2]
     #comm3
     #comm4
    ]]

    ((3+1+a+$c*(x) & 0x43422fd+03-085/23#D9a@_^8))
    ((1/(2-(a-4))))

    # they are not arithmetic evaluations...
    ((cmd && cmd) || cmd)
    $((cmd && cmd) || cmd)
    ((cmd &&
    cmd) || cmd)
    $((cmd &&
    cmd) || cmd)

    { echo
        echo
    }
    { echo ; }
    (echo ; echo)
    (echo
        echo)
    (echo a)
    ({ echo plop;})
    [ a -eq 2 ] || [ a -eq 2] ] && [[ a -eq 2 ]] || [[ a != b ]];
    [ a -eq 2 ]||[ a -eq 2] ]&&[[ a -eq 2 ]]||[[ a != b ]];
    test a -eq b

    # functions
    a() { echo x; }
    a  () { echo x; }
    function f { echo x; }
    kde.org() { echo x; }
    --func() { echo x; }

    # variables
    a=(a b c)
    a='a'
    a+=b
    a[1]='a'
    a[$i]='x'
    a[$((
        2+4
    ))]='x'
    a=([a]=2 `echo` -s > 'ds')
    a=(#comment
    value#nocomment #comment)
    )
    a=a cat
    a=`ls` cat

    # errors
    a a(s) a

    # control structure
    for name in a b c {d,e} ; do echo ; done
    for name; do echo ; done
    for name do echo ; done
    for ((i=0;i<5;++i)) ; do echo $i ; done
    select name in a ; do echo ; done
    select name; do echo ; done
    if : ; then echo ; elif [[ : ]] ; then echo ; else echo ; fi
    while : || : ; do echo ; done
    until : ; : ; do echo ; done
    case a in a) esac
    case a in a) echo ; esac
    case pwd in (patt1) echo ; echo ;; (patt*) echo ;;& patt?|patt) echo ;&
    patt) echo ;; esac

    for name in a
     b c ;
    do
    echo
    done

    case a in
      a\( | b*c? ) echo
      (b$c) # no pattern
      ;;
      (b$c) ;;
      # no pattern
      (b$c)
    esac

    case "$1" in
     "a") run_a|&a;;
     "b") run_b;;
     "c") run_c;;
     *) echo "Plase choose between 'a', 'b' or 'c'" && exit 1;;
    esac