Você deve escrever assim:
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
Ou seja, todas as variáveis usadas como argumentos de linha de comando devem ser protegidas por delimitação entre aspas. As aspas duplas em torno das variáveis garantem que a expressão seja tratada como um valor único, portanto, o shell não a dividirá em palavras. Observe que "
incorporado em "..."
precisa ser escapado,
e escrito como \"
. Uma solução mais simples é usar aspas simples em vez das aspas duplas incorporadas, assim:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"
Por fim, estou pensando se você realmente queria ter 2> "$ERROR"
no host local e não no host remoto. Eu suspeito que você realmente queria isso no host remoto, então isso é outro erro na linha de comando original.
Se for esse o caso, então aqui está a correção:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"