Você precisa garantir que os loop vars não foram detectados no host remoto:
ssh -t -t $username@$sourceIP 'bash -s' <<ENDSSH
IFS='-'
for sourceP in $port; do
for destinationP in $destinationPorts; do
echo "\$sourceP" - "\$destinationP"
done
done
ENDSSH
Usar todos os parênteses lança um subshell para cada iteração de loop, que é um monte de trabalho extra que você não precisa.
Você não precisa exportar todas as suas variáveis, apenas aquelas que precisam estar no ambiente para processos filhos.
Este destIP=$(echo "$f2" | tr -d '\n')
não é diferente de destIP=$f2
- assumindo que não há novas linhas "internas". $(command substitution)
remove as novas linhas finais.