SC2021 – ShellCheck Wiki

See this page on GitHub


Don't use [] around ranges in tr, it replaces literal square brackets.

Problematic code:

tr -cd '[a-z]'

Correct code:

tr -cd 'a-z'


Ancient System V tr required brackets around operands, but modern implementations including POSIX, GNU, OS X and *BSD instead treat them as literals.

Unless you want to operate on literal square brackets, don't include them.


If you do want to replace literal square brackets, reorder the expression (e.g. a-z[] to make it clear that the brackets are not special).

ShellCheck does not warn about correct usage of [..] in character and equivalence classes like [:lower:] and [=e=].

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