Lorsque tu utilise "$@" avec par exemple trois arguments a1 a2 a3 dans [ -z "$@" ] il faut savoir que le Shell réalise l'interpolation de "$@" avant l'interprétation
du test [ -z arg ]
ce qui donne
[ -z a1 a2 a3 ] et donc trop d'arguments pour le test '-z' qui ne doit contenir qu'un seul argument.
Ce qui marche avec $1 ( ou $2 ... ) ne peut pas marcher directement avec $@ si le nombre d'arguments est supérieur à un.
Ceci pourrait être un exemple d'utilisation de $@ mais en passant par une variable intermédiaire :
#!/bin/bash
args=$@
if [ -z "$args" ]
then
echo "pas d'argument"
exit 1
fi
for nomfichier in "$@";do
echo ${nomfichier%$1}
done