Clone
3
SC2231
Andrei Korshikov edited this page 2025-01-27 22:59:50 +06:00

Quote expansions in this for loop glob to prevent word splitting, e.g. "${dir}"/*.txt.

Problematic code:

for file in ${dir}/*.txt
do
  echo "Found ${file}"
done

Correct code:

for file in "${dir}"/*.txt
do
  echo "Found ${file}"
done

Rationale:

When iterating over globs containing expansions, you can still quote all expansions in the path to better handle whitespace and special characters.

Just make sure glob characters are outside quotes. "${dir}/*.txt" will not glob expand, but "${dir}"/*.txt or "${dir}"/*."${ext}" will.

Exceptions:

Exceptions similar to SC2086 apply. If the variable is expected to contain globs, such as if dir="tmp/**" in the example, you can ignore this message.

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!