All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sonar.l10n.shellcheck.rules.shellcheck.SC2202.html Maven / Gradle / Ivy

Globs don't work as operands in [ ]. Use a loop.

Problematic code

[ current.log -nt backup/*.log ] && echo "This is the latest file"

Correct code

newerThanAll=true
for log in backup/*.log
do
  [ current.log -nt "$log" ] || newerThanAll=false
done
[ "$newerThanAll" = "true" ] && echo "This is the latest file"

Rationale

Globs in [ ] will expand to a sequence of words, one per matching filename. Meanwhile, operators work on single words.

The problematic code is equivalent to [ current.log -nt backup/file1.log backup/file2.log backup/file3.log ], which is invalid syntax. A typical error message is bash: [: too many arguments or dash: somefile: unexpected operator.

Instead, use a for loop to iterate over matching filenames, and apply your condition to each.

Exceptions

If you know your glob will only ever match one file, you can check this explicitly and use the first file:

set -- backup/*.log
[ $# -eq 1 ] || { echo "There are too many matches."; exit 1; }
[ file.log -nt "$1" ] && echo "This is the latest file"

Alternatively, [[ignore]] this warning.





© 2015 - 2025 Weber Informatics LLC | Privacy Policy