SC1012 – ShellCheck Wiki

See this page on GitHub

Sitemap


\t is just literal t here. For tab, use "$(printf '\t')" instead.

Problematic code:

# Want tab
$ var=foo\tbar
$ printf '<%s>\n' "$var"
<footbar>

$ var=foo\\tbar
$ printf '<%s>\n' "$var"
<foo\tbar>

or

# Want newline
$ var=foo\nbar
$ printf '<%s>\n' "$var"
<foonbar>

$ var=foo\\nbar
$ printf '<%s>\n' "$var"
<foo\nbar>

Correct code:

$ var="foo$(printf '\t')bar"  # As suggested in warning
$ printf '<%s>\n' "$var"
<foo    bar>

$ var="$(printf 'foo\tbar')"  # Equivalent alternative
$ printf '<%s>\n' "$var"
<foo    bar>

or

$ # Literal, quoted newline
$ line="foo
> bar"
$ printf '<%s>\n' "$line"
<foo
bar>

or

$ # Newline using ANSI-C quoting
$ line=$'foo\nbar'
$ printf '<%s>\n' "$line"
<foo
bar>

Rationale:

ShellCheck has found a \t, \n or \r in a context where they just become regular letters t, n or r. Most likely, it was intended as a tab, newline or carriage return.

To generate such characters (plus other less common ones including \a, \f and octal escapes) , use printf as in the example. The exception is for newliness that would be stripped by command substitution; in these cases, use a literal quoted newline instead.

Other characters like \z generate a SC1001 info message, as the intent is less certain.

Exceptions:

None.

https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-printf https://pubs.opengroup.org/onlinepubs/9799919799/utilities/printf.html https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html


ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.