Há duas coisas acontecendo. A instrução if list; then list; [elif list; then list;] ... [else list;] fi
opera nos status de saída. Se o status de saída da lista # 1 for 0, a lista 2 será executada; senão vai para a lista 3.
O comando de teste (que é colocado em alias com colchetes) retorna 0 se o código for bem-sucedido. [ -e /etc/passwd ]
.
Então, no sentido, é o mesmo que em C e Java, mas invertido.
Script corrigido
#!/bin/mksh
#set -x
echo "Start!"
while IFS= read entry; do
if [ -e "$entry" ] ; then
echo "$entry exist"
else
echo "$entry doesnt exist"
fi
done < $HOME/pathlist.txt
Além disso, não codifique antes de tomar café