Exactly on topic. Check it out! ( Just a wiki with a bunch of examples )
This page shows common errors that Bash programmers make. The following examples are all flawed in some way:
http://mywiki.wooledge.org/BashPitfallsexamples shown:
Contents
for i in $(ls *.mp3)
cp $file $target
Filenames with leading dashes
[ $foo = "bar" ]
cd $(dirname "$f")
[ "$foo" = bar && "$bar" = foo ]
[[ $foo > 7 ]]
grep foo bar | while read -r; do ((count++)); done
if [grep foo myfile]
if [bar="$foo"]
if [ [ a = b ] && [ c = d ] ]
read $foo
cat file | sed s/foo/bar/ > file
echo $foo
$foo=bar
foo = bar
echo <<EOF
su -c 'some command'
cd /foo; bar
[ bar == "$foo" ]
for i in {1..10}; do ./something &; done
cmd1 && cmd2 || cmd3
echo "Hello World!"
for arg in $*
function foo()
echo "~"
local varname=$(command)
sed 's/$foo/good bye/'
tr [A-Z] [a-z]
ps ax | grep gedit
printf "$foo"
for i in {1..$n}
if [[ $foo = $bar ]] (depending on intent)
if [[ $foo =~ 'some RE' ]]
[ -n $foo ] or [ -z $foo ]
[[ -e "$broken_symlink" ]] returns 1 even though $broken_symlink exists
ed file <<<"g/d\{0,3\}/s//e/g" fails
expr sub-string fails for "match"
On UTF-8 and Byte-Order Marks (BOM)
$() removes trailing newlines