Je vais te donner un conseil. La grammaire du shell est un peu subtile, donc met des espaces partout ( avant les ';', avant et après les '['/']', etc.). Et si tu fais un script, passe à la ligne souvent.
Après, moi j'utiliserai && pour faire un & (un simple & ça ne fait pas vraiment un & logique, essaie "firefox & echo 2" dans un terminal)
Au passage, à l'intérieur d'un [ ], tu peux utiliser un '-a' pour faire un ET logique.
Ensuite, on utilise <,>,=,... pour des châines de caractères et -eq,-lt,-gt,... pour des nombres. Ici, il faut bien que tu utilises un = (ou == mais ce dernier ne semble pas être POSIX donc c'est moins bien). Mais il y a un problème avec les $truc. Si ton $truc est vide, tu vas avoir l'erreur que tu mentionnes :
[ $toto = "a" ] va être changé en [ = "a" ] une fois que $toto a été remplacé par sa valeur...
Manifestement, ce qui est à droite n'est pas syntaxiquement correct. Pour palier à ça, c'est simple, on fait :
[ "$toto" = "a" ] qui devient [ "" = "a" ].
Voilà. 