""
''
"foo"
'foo'
"foo
bar"
'foo
bar'
"'foo'"
'"bar"'
"$@"
"${foo}"
\\"foo"
\'a # ' not a string

<< STRING_END
foo
bar
STRING_END

<<- STRING_END
foo
bar
STRING_END

<<   EOF
foo $@
bar
EOF

<< 'EOF'
'single quoted string'
"double quoted string"
EOF

<< "EOF"
foo
$bar
EOF

<< STRING_END
# comment
STRING_END

"  # comment  "

----------------------------------------------------

[
	["string", [
		"\"\""
	]],
	["string", [
		"''"
	]],
	["string", [
		"\"foo\""
	]],
	["string", [
		"'foo'"
	]],
	["string", [
		"\"foo\r\nbar\""
	]],
	["string", [
		"'foo\r\nbar'"
	]],
	["string", [
		"\"'foo'\""
	]],
	["string", [
		"'\"bar\"'"
	]],
	["string", [
		"\"",
		["variable", "$@"],
		"\""
	]],
	["string", [
		"\"",
		["variable", [
			"${foo}"
		]],
		"\""
	]],
	["punctuation", "\\"],
	["punctuation", "\\"],
	["string", [
		"\"foo\""
	]],
	["punctuation", "\\"],
	"'a ",
	["comment", "# ' not a string"],

	["operator", [
		"<<"
	]],
	["string", [
		"STRING_END\r\nfoo\r\nbar\r\nSTRING_END"
	]],

	["operator", [
		"<<-"
	]],
	["string", [
		"STRING_END\r\nfoo\r\nbar\r\nSTRING_END"
	]],

	["operator", [
		"<<"
	]],
	["string", [
		"EOF\r\nfoo ",
		["variable", "$@"],
		"\r\nbar\r\nEOF"
	]],

	["operator", [
		"<<"
	]],
	["string", [
		"'EOF'\r\n'single quoted string'\r\n\"double quoted string\"\r\nEOF"
	]],

	["operator", [
		"<<"
	]],
	["string", [
		"\"EOF\"\r\nfoo\r\n$bar\r\nEOF"
	]],

	["operator", [
		"<<"
	]],
	["string", [
		"STRING_END\r\n# comment\r\nSTRING_END"
	]],

	["string", [
		"\"  # comment  \""
	]]
]

----------------------------------------------------

Checks for single-quoted and double-quoted strings.
Also checks for variables in strings.
