3 SC2021
Olliver Schinagl edited this page 2024-07-24 09:35:41 +02:00

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

Problematic code:

tr -cd '[a-z]'

Correct code:

tr -cd 'a-z'

Rationale:

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.

Exceptions:

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=].

Note:

Busybox requires CONFIG_FEATURE_TR_CLASSES for this to work. If busybox was compiled without this feature, character classes will obviously not be available, and the correct usage is to use a-z, not [a-z].