Você precisa mover a posição do $ e adicionar um último /
ao sub para executá-lo em todos os espaços. Você também precisa citar as variáveis, pois ele verá o espaço no nome do arquivo como um delimitador entre os argumentos para mv.
#!/bin/bash
newFile=""
for file in *
do
newFile=${file// /_} # so as to replace spaces with underscores
mv "{$file}" "{$newFile}"
done
Embora, conforme declarado na outra resposta, metade desse script seja redundante.
newFile=""
Não é necessário, pois a variável pode ser referenciada pela primeira vez na atribuição mais tarde.
newFile=${file// /_}
Embora a atribuição em si também não seja necessária, pois a substituição do parâmetro não altera o original.
Por isso, pode ser reescrito como
#!/bin/bash
for file in *
do
mv "${file}" "${file// /_}"
done