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
