# code-block-pro/1.7.0/build/shiki/languages/shellscript.tmLanguage.json

Code Block Pro – Beautiful Syntax Highlighting, version 1.7.0. 1,344 lines.

- Page: https://pluginprobe.com/plugins/code-block-pro/1.7.0/code/build/shiki/languages/shellscript.tmLanguage.json
- Raw: https://pluginprobe.com/plugins/code-block-pro/1.7.0/raw/build/shiki/languages/shellscript.tmLanguage.json
- Modified: 2022-08-22T22:25:46+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/code-block-pro/1.7.0/code/build/shiki/languages/shellscript.tmLanguage.json#L10-L20`.

```json
{
  "information_for_contributors": [
    "This file has been converted from https://github.com/atom/language-shellscript/blob/master/grammars/shell-unix-bash.cson",
    "If you want to provide a fix or improvement, please create a pull request against the original repository.",
    "Once accepted there, we are happy to receive an update request."
  ],
  "version": "https://github.com/atom/language-shellscript/commit/4f8d7bb5cc4d1643674551683df10fe552dd5a6f",
  "name": "shellscript",
  "scopeName": "source.shell",
  "patterns": [
    {
      "include": "#comment"
    },
    {
      "include": "#pipeline"
    },
    {
      "include": "#list"
    },
    {
      "include": "#compound-command"
    },
    {
      "include": "#loop"
    },
    {
      "include": "#string"
    },
    {
      "include": "#function-definition"
    },
    {
      "include": "#variable"
    },
    {
      "include": "#interpolation"
    },
    {
      "include": "#heredoc"
    },
    {
      "include": "#herestring"
    },
    {
      "include": "#redirection"
    },
    {
      "include": "#pathname"
    },
    {
      "include": "#keyword"
    },
    {
      "include": "#support"
    }
  ],
  "repository": {
    "case-clause": {
      "patterns": [
        {
          "begin": "(?=\\S)",
          "end": ";;",
          "endCaptures": {
            "0": {
              "name": "punctuation.terminator.case-clause.shell"
            }
          },
          "name": "meta.scope.case-clause.shell",
          "patterns": [
            {
              "begin": "\\(|(?=\\S)",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.case-pattern.shell"
                }
              },
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.definition.case-pattern.shell"
                }
              },
              "name": "meta.scope.case-pattern.shell",
              "patterns": [
                {
                  "match": "\\|",
                  "name": "punctuation.separator.pipe-sign.shell"
                },
                {
                  "include": "#string"
                },
                {
                  "include": "#variable"
                },
                {
                  "include": "#interpolation"
                },
                {
                  "include": "#pathname"
                }
              ]
            },
            {
              "begin": "(?<=\\))",
              "end": "(?=;;)",
              "name": "meta.scope.case-clause-body.shell",
              "patterns": [
                {
                  "include": "$self"
                }
              ]
            }
          ]
        }
      ]
    },
    "comment": {
      "begin": "(^\\s+)?(?<=^|\\W)(?<!-)(?=#)(?!#{)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.whitespace.comment.leading.shell"
        }
      },
      "end": "(?!\\G)",
      "patterns": [
        {
          "begin": "#!",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.shebang.shell"
            }
          },
          "end": "$",
          "name": "comment.line.number-sign.shebang.shell"
        },
        {
          "begin": "#",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.shell"
            }
          },
          "end": "$",
          "name": "comment.line.number-sign.shell"
        }
      ]
    },
    "compound-command": {
      "patterns": [
        {
          "begin": "\\[{1,2}",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.logical-expression.shell"
            }
          },
          "end": "\\]{1,2}",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.logical-expression.shell"
            }
          },
          "name": "meta.scope.logical-expression.shell",
          "patterns": [
            {
              "include": "#logical-expression"
            },
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "\\({2}",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "\\){2}",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.other.math.shell",
          "patterns": [
            {
              "include": "#math"
            }
          ]
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.subshell.shell"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.subshell.shell"
            }
          },
          "name": "meta.scope.subshell.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=\\s|^){(?=\\s|$)",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.group.shell"
            }
          },
          "end": "(?<=^|;)\\s*(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.group.shell"
            }
          },
          "name": "meta.scope.group.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "function-definition": {
      "patterns": [
        {
          "begin": "(?<=^|;|&|\\s)(function)\\s+([^\\s\\\\]+)(?:\\s*(\\(\\)))?",
          "beginCaptures": {
            "1": {
              "name": "storage.type.function.shell"
            },
            "2": {
              "name": "entity.name.function.shell"
            },
            "3": {
              "name": "punctuation.definition.arguments.shell"
            }
          },
          "end": ";|&|$",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.function.shell"
            }
          },
          "name": "meta.function.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=^|;|&|\\s)([^\\s\\\\=]+)\\s*(\\(\\))",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.shell"
            },
            "2": {
              "name": "punctuation.definition.arguments.shell"
            }
          },
          "end": ";|&|$",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.function.shell"
            }
          },
          "name": "meta.function.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "heredoc": {
      "patterns": [
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(RUBY)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(RUBY)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.ruby.shell",
          "contentName": "source.ruby.embedded.shell",
          "patterns": [
            {
              "include": "source.ruby"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(RUBY)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(RUBY)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.ruby.shell",
          "contentName": "source.ruby.embedded.shell",
          "patterns": [
            {
              "include": "source.ruby"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(PYTHON)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(PYTHON)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.python.shell",
          "contentName": "source.python.embedded.shell",
          "patterns": [
            {
              "include": "source.python"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(PYTHON)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(PYTHON)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.python.shell",
          "contentName": "source.python.embedded.shell",
          "patterns": [
            {
              "include": "source.python"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(APPLESCRIPT)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(APPLESCRIPT)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.applescript.shell",
          "contentName": "source.applescript.embedded.shell",
          "patterns": [
            {
              "include": "source.applescript"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(APPLESCRIPT)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(APPLESCRIPT)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.applescript.shell",
          "contentName": "source.applescript.embedded.shell",
          "patterns": [
            {
              "include": "source.applescript"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(HTML)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(HTML)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.html.shell",
          "contentName": "text.html.embedded.shell",
          "patterns": [
            {
              "include": "text.html.basic"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(HTML)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(HTML)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.html.shell",
          "contentName": "text.html.embedded.shell",
          "patterns": [
            {
              "include": "text.html.basic"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(MARKDOWN)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(MARKDOWN)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.markdown.shell",
          "contentName": "text.html.markdown.embedded.shell",
          "patterns": [
            {
              "include": "text.html.markdown"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(MARKDOWN)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(MARKDOWN)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.markdown.shell",
          "contentName": "text.html.markdown.embedded.shell",
          "patterns": [
            {
              "include": "text.html.markdown"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(TEXTILE)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(TEXTILE)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.textile.shell",
          "contentName": "text.html.textile.embedded.shell",
          "patterns": [
            {
              "include": "text.html.textile"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(TEXTILE)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(TEXTILE)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.textile.shell",
          "contentName": "text.html.textile.embedded.shell",
          "patterns": [
            {
              "include": "text.html.textile"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|'|)\\s*(SHELL)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(\\3)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "contentName": "source.shell.embedded.shell",
          "name": "string.unquoted.heredoc.no-indent.shell.shell",
          "patterns": [
            {
              "include": "source.shell"
            }
          ]
        },
        {
          "begin": "(<<)\\s*(\"|'|)\\s*(SHELL)(?=\\s|;|&|<|\"|')\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(\\3)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.shell.shell",
          "contentName": "source.shell.embedded.shell",
          "patterns": [
            {
              "include": "source.shell"
            }
          ]
        },
        {
          "begin": "(<<)-\\s*(\"|')\\s*\\\\?([^;&<\\s]+)\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(\\3)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.no-indent.shell"
        },
        {
          "begin": "(<<)\\s*(\"|')\\s*\\\\?([^;&<\\s]+)\\2",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "3": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(\\3)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.shell"
        },
        {
          "begin": "(<<)-\\s*\\\\?([^;&<\\s]+)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "2": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^\\t*(\\2)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.expanded.no-indent.shell",
          "patterns": [
            {
              "match": "\\\\[\\$`\\\\\\n]",
              "name": "constant.character.escape.shell"
            },
            {
              "include": "#variable"
            },
            {
              "include": "#interpolation"
            }
          ]
        },
        {
          "begin": "(<<)\\s*\\\\?([^;&<\\s]+)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.heredoc.shell"
            },
            "2": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "end": "^(\\2)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.heredoc-token.shell"
            }
          },
          "name": "string.unquoted.heredoc.expanded.shell",
          "patterns": [
            {
              "match": "\\\\[\\$`\\\\\\n]",
              "name": "constant.character.escape.shell"
            },
            {
              "include": "#variable"
            },
            {
              "include": "#interpolation"
            }
          ]
        }
      ]
    },
    "herestring": {
      "patterns": [
        {
          "begin": "(<<<)\\s*(('))",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.herestring.shell"
            },
            "2": {
              "name": "string.quoted.single.shell"
            },
            "3": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "(')",
          "endCaptures": {
            "0": {
              "name": "string.quoted.single.shell"
            },
            "1": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "meta.herestring.shell",
          "contentName": "string.quoted.single.shell"
        },
        {
          "begin": "(<<<)\\s*((\"))",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.herestring.shell"
            },
            "2": {
              "name": "string.quoted.double.shell"
            },
            "3": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "(\")",
          "endCaptures": {
            "0": {
              "name": "string.quoted.double.shell"
            },
            "1": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "meta.herestring.shell",
          "contentName": "string.quoted.double.shell"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.herestring.shell"
            },
            "2": {
              "name": "string.unquoted.herestring.shell",
              "patterns": [
                {
                  "include": "$self"
                }
              ]
            }
          },
          "match": "(<<<)\\s*(([^\\s)\\\\]|\\\\.)+)",
          "name": "meta.herestring.shell"
        }
      ]
    },
    "interpolation": {
      "patterns": [
        {
          "begin": "\\$\\({2}",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "\\){2}",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.other.math.shell",
          "patterns": [
            {
              "include": "#math"
            }
          ]
        },
        {
          "begin": "`",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "`",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.interpolated.backtick.shell",
          "patterns": [
            {
              "match": "\\\\[`\\\\$]",
              "name": "constant.character.escape.shell"
            },
            {
              "begin": "(?<=\\W)(?=#)(?!#{)",
              "beginCaptures": {
                "1": {
                  "name": "punctuation.whitespace.comment.leading.shell"
                }
              },
              "end": "(?!\\G)",
              "patterns": [
                {
                  "begin": "#",
                  "beginCaptures": {
                    "0": {
                      "name": "punctuation.definition.comment.shell"
                    }
                  },
                  "end": "(?=`)",
                  "name": "comment.line.number-sign.shell"
                }
              ]
            },
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "\\$\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.interpolated.dollar.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "keyword": {
      "patterns": [
        {
          "match": "(?<=^|;|&|\\s)(then|else|elif|fi|for|in|do|done|select|case|continue|esac|while|until|return)(?=\\s|;|&|$)",
          "name": "keyword.control.shell"
        },
        {
          "match": "(?<=^|;|&|\\s)(?:export|declare|typeset|local|readonly)(?=\\s|;|&|$)",
          "name": "storage.modifier.shell"
        }
      ]
    },
    "list": {
      "patterns": [
        {
          "match": ";|&&|&|\\|\\|",
          "name": "keyword.operator.list.shell"
        }
      ]
    },
    "logical-expression": {
      "patterns": [
        {
          "comment": "do we want a special rule for ( expr )?",
          "match": "=[=~]?|!=?|<|>|&&|\\|\\|",
          "name": "keyword.operator.logical.shell"
        },
        {
          "match": "(?<!\\S)-(nt|ot|ef|eq|ne|l[te]|g[te]|[a-hknoprstuwxzOGLSN])",
          "name": "keyword.operator.logical.shell"
        }
      ]
    },
    "loop": {
      "patterns": [
        {
          "begin": "(?<=^|;|&|\\s)(for)\\s+(?=\\({2})",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.shell"
            }
          },
          "end": "(?<=^|;|&|\\s)done(?=\\s|;|&|$)",
          "endCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "name": "meta.scope.for-loop.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=^|;|&|\\s)(for)\\s+(.+?)\\s+(in)(?=\\s|;|&|$)",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.shell"
            },
            "2": {
              "name": "variable.other.loop.shell",
              "patterns": [
                {
                  "include": "#string"
                }
              ]
            },
            "3": {
              "name": "keyword.control.shell"
            }
          },
          "end": "(?<=^|;|&|\\s)done(?=\\s|;|&|$)",
          "endCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "name": "meta.scope.for-in-loop.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=^|;|&|\\s)(while|until)(?=\\s|;|&|$)",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.shell"
            }
          },
          "end": "(?<=^|;|&|\\s)done(?=\\s|;|&|$)",
          "endCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "name": "meta.scope.while-loop.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=^|;|&|\\s)(select)\\s+((?:[^\\s\\\\]|\\\\.)+)(?=\\s|;|&|$)",
          "beginCaptures": {
            "1": {
              "name": "keyword.control.shell"
            },
            "2": {
              "name": "variable.other.loop.shell"
            }
          },
          "end": "(?<=^|;|&|\\s)(done)(?=\\s|;|&|$)",
          "endCaptures": {
            "1": {
              "name": "keyword.control.shell"
            }
          },
          "name": "meta.scope.select-block.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=^|;|&|\\s)case(?=\\s|;|&|$)",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "end": "(?<=^|;|&|\\s)esac(?=\\s|;|&|$)",
          "endCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "name": "meta.scope.case-block.shell",
          "patterns": [
            {
              "begin": "(?<=^|;|&|\\s)in(?=\\s|;|&|$)",
              "beginCaptures": {
                "0": {
                  "name": "keyword.control.shell"
                }
              },
              "end": "(?<=^|;|&|\\s)(?=esac(\\s|;|&|$))",
              "name": "meta.scope.case-body.shell",
              "patterns": [
                {
                  "include": "#comment"
                },
                {
                  "include": "#case-clause"
                },
                {
                  "include": "$self"
                }
              ]
            },
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(?<=^|;|&|\\s)if(?=\\s|;|&|$)",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "end": "(?<=^|;|&|\\s)fi(?=\\s|;|&|$)",
          "endCaptures": {
            "0": {
              "name": "keyword.control.shell"
            }
          },
          "name": "meta.scope.if-block.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "math": {
      "patterns": [
        {
          "include": "#variable"
        },
        {
          "match": "\\+{1,2}|-{1,2}|!|~|\\*{1,2}|/|%|<[<=]?|>[>=]?|==|!=|^|\\|{1,2}|&{1,2}|\\?|\\:|,|=|[*/%+\\-&^|]=|<<=|>>=",
          "name": "keyword.operator.arithmetic.shell"
        },
        {
          "match": "0[xX][0-9A-Fa-f]+",
          "name": "constant.numeric.hex.shell"
        },
        {
          "match": "0\\d+",
          "name": "constant.numeric.octal.shell"
        },
        {
          "match": "\\d{1,2}#[0-9a-zA-Z@_]+",
          "name": "constant.numeric.other.shell"
        },
        {
          "match": "\\d+",
          "name": "constant.numeric.integer.shell"
        }
      ]
    },
    "pathname": {
      "patterns": [
        {
          "match": "(?<=\\s|:|=|^)~",
          "name": "keyword.operator.tilde.shell"
        },
        {
          "match": "\\*|\\?",
          "name": "keyword.operator.glob.shell"
        },
        {
          "begin": "([?*+@!])(\\()",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.extglob.shell"
            },
            "2": {
              "name": "punctuation.definition.extglob.shell"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.extglob.shell"
            }
          },
          "name": "meta.structure.extglob.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        }
      ]
    },
    "pipeline": {
      "patterns": [
        {
          "match": "(?<=^|;|&|\\s)(time)(?=\\s|;|&|$)",
          "name": "keyword.other.shell"
        },
        {
          "match": "[|!]",
          "name": "keyword.operator.pipe.shell"
        }
      ]
    },
    "redirection": {
      "patterns": [
        {
          "begin": "[><]\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.interpolated.process-substitution.shell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "match": "(?<![<>])(&>|\\d*>&\\d*|\\d*(>>|>|<)|\\d*<&|\\d*<>)(?![<>])",
          "name": "keyword.operator.redirect.shell"
        }
      ]
    },
    "string": {
      "patterns": [
        {
          "match": "\\\\.",
          "name": "constant.character.escape.shell"
        },
        {
          "begin": "'",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "'",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.quoted.single.shell"
        },
        {
          "begin": "\\$?\"",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "\"",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.quoted.double.shell",
          "patterns": [
            {
              "match": "\\\\[\\$`\"\\\\\\n]",
              "name": "constant.character.escape.shell"
            },
            {
              "include": "#variable"
            },
            {
              "include": "#interpolation"
            }
          ]
        },
        {
          "begin": "\\$'",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.shell"
            }
          },
          "end": "'",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.shell"
            }
          },
          "name": "string.quoted.single.dollar.shell",
          "patterns": [
            {
              "match": "\\\\(a|b|e|f|n|r|t|v|\\\\|')",
              "name": "constant.character.escape.ansi-c.shell"
            },
            {
              "match": "\\\\[0-9]{3}",
              "name": "constant.character.escape.octal.shell"
            },
            {
              "match": "\\\\x[0-9a-fA-F]{2}",
              "name": "constant.character.escape.hex.shell"
            },
            {
              "match": "\\\\c.",
              "name": "constant.character.escape.control-char.shell"
            }
          ]
        }
      ]
    },
    "support": {
      "patterns": [
        {
          "match": "(?<=^|;|&|\\s)(?::|\\.)(?=\\s|;|&|$)",
          "name": "support.function.builtin.shell"
        },
        {
          "match": "(?<=^|;|&|\\s)(?:alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|dirs|disown|echo|enable|eval|exec|exit|false|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|times|trap|true|type|ulimit|umask|unalias|unset|wait)(?=\\s|;|&|$)",
          "name": "support.function.builtin.shell"
        }
      ]
    },
    "variable": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.variable.shell"
            }
          },
          "match": "(\\$)[a-zA-Z_][a-zA-Z0-9_]*",
          "name": "variable.other.normal.shell"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.variable.shell"
            }
          },
          "match": "(\\$)[-*@#?$!0_]",
          "name": "variable.other.special.shell"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.definition.variable.shell"
            }
          },
          "match": "(\\$)[1-9]",
          "name": "variable.other.positional.shell"
        },
        {
          "begin": "\\${",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.variable.shell"
            }
          },
          "end": "}",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.variable.shell"
            }
          },
          "name": "variable.other.bracket.shell",
          "patterns": [
            {
              "match": "!|:[-=?]?|\\*|@|#{1,2}|%{1,2}|/",
              "name": "keyword.operator.expansion.shell"
            },
            {
              "captures": {
                "1": {
                  "name": "punctuation.section.array.shell"
                },
                "3": {
                  "name": "punctuation.section.array.shell"
                }
              },
              "match": "(\\[)([^\\]]+)(\\])"
            },
            {
              "include": "#variable"
            },
            {
              "include": "#string"
            }
          ]
        }
      ]
    }
  }
}

```
