Afin d'éviter de créer des scripts troués, une bonne pratique est d'utiliser le double-tiret -- pour marquer la fin des options d'une commande bash.
En effet, supposons que je veuille lister les fichiers d'un répertoires. Rien n'empêche qu'un répertoire s'appelle -o et active donc l'option associée. Pour signifier à la commande ls d'ignorer ce qui suit mes options je procède ainsi :
# Mon répertoire s'appelle "-o -a"
var="-o -a"
# J'ajoute un double-tiret pour signifier la fin des options
ls -l -- "$var"
# Une fois la variable évaluée, la commande ressemblera à ceci
ls -l -- -o -a
# Et seule l'option -l sera prise en compte
Cette convention est reprise par toutes les commandes built-in de bash (+ d'autres shells comme csh et sh) sauf une poignée (true, false, echo et eval).
J'avais fais quelques tests il y a quelques mois, pour voir ce qu'on pouvait faire en "hackant" les options des commandes. Pour ls c'est ennuyeux. Mais il suffit d'imaginer les conséquences avec rm par exemple ...
Note à moi-même : il faudra que j'essaie getopt pour créer un parseur d'options en bash.