echo в разных шеллах и с флагами -e/-n ведёт себя непредсказуемо. printf — POSIX-стандарт с одинаковым поведением везде, плюс контроль, которого у echo просто нет: выравнивание, нули, точность после запятой.

printf "%-10s %5d\n" "disk1" 87    # ширина и выравнивание — таблицы в логах
printf "%.2f%%\n" 87.3456          # точность после запятой
printf "backup_%03d.tar\n" 7       # backup_007.tar

# запись в переменную без $(...) и лишнего subshell
printf -v msg "Ошибка на хосте %s, код %d" "$host" "$code"

%q экранирует строку так, что результат безопасно вставить обратно в shell — printf "%q\n" "$var" пригождается при генерации команд из переменных с пробелами.

#bash