It is common to use a for-loop with glob patterns:
for i in *.txt; do
mv $i $i.old
done
But if the glob pattern does not match anything it will be preserved unchanged in the command. This results in command execution of mv *.txt *.txt.old which fails because no file named *.txt (literally!) exists.
As this is not the desired behavior, here is a way how to do this as expected without forking using the nullglob bash shell option.
oldnullglob=$(shopt -p nullglob)
shopt -s nullglob
for i in *.txt; do
mv $i $i.old
done
eval "$oldnullglob" 2>/dev/null
unset oldnullglob
This will silently prevent the execution of the mv command. If you use failglob instead of nullglob bash will interrupt the evaluation of any command if the glob pattern did not match anything.
Disclaimer: Be careful with this option, as this will not be the expected behavior in all cases. Most (in)famously it breaks bash-completion if you set it in your interactive bash session. I suggest to use it temporary only.
