O comando curl é executado, mas sua saída não é atribuída a num_redirect . Isso significa que a saída de onda é mostrada, ou seja, "3" (sem uma nova linha). No entanto, uma nova linha é inserida quando echo $num_redirect é executado, pois a variável está vazia. Isso dá a impressão de que a variável num_redirect tem o valor "3".
Você deve usar backticks ou $() para executar um comando e capturar sua saída no stdout.
num_redirect=$(curl -L -s -w %{num_redirects} "http://dx.doi.org/"$doi -o /dev/null)
Além disso, você deve comparar a variável com um inteiro usando [ e ] . Agora você está, novamente, apenas avaliando o comando.
if [ "$num_redirect" -eq 3 ]
then
...
else
...
fi