Почему в выводе bash-скрипта появляется лишний символ %: разбор ошибки формата даты

Вы запускаете скрипт, который должен записывать текущее время в файл, но вместо аккуратной строки вроде lun.24 17:40:28 получаете что-то вроде lun.24% +17:40:40. Знакомо? Это классический пример того, как мелочи синтаксиса могут сбить с толку даже опытного пользователя. Давайте разберёмся, откуда берётся этот загадочный процент и как от него избавиться – без лишней теории, только практика.

Почему появляется символ % и как его убрать

Всё дело в том, как bash обрабатывает специальные символы. Посмотрите на две версии команды date:

# Вариант 1 (работает в терминале):  
echo $(date +%a%d %X)  

# Вариант 2 (из скрипта):  
echo $(date +%a%d% +%X)

Видите разницу? В первом случае после %d стоит обратный слэш, который экранирует пробел. Во втором – знак % перед пробелом. Именно этот лишний символ и появляется в выводе. Bash интерпретирует % как специальный символ формата, а когда не находит за ним буквы (вроде %Y или %m), просто вставляет его как есть.

Как исправить:

1. Либо экранируйте пробел обратным слэшем:

echo $(date +%a%d %X)

2. Либо заключите формат в кавычки:

echo $(date "+%a%d %X")

Кстати, второй вариант надёжнее – кавычки предотвращают «поедание» пробелов оболочкой. Проверьте сами: если запустить скрипт после правки, процент исчезнет.

Типичные ошибки и как их избежать

1. Путаница между экранированием в терминале и скриптах

То, что работает в командной строке, не всегда сработает в скрипте. Например, обратный слэш может теряться при записи в файл. Всегда проверяйте команды через echo перед вставкой в скрипт:

# Так вы увидите реальный результат до запуска:  
   echo "date +%a%d %X"

2. Неправильное использование перенаправления

В исходном скрипте используется >>. Это безопасно, но если в пути есть пробелы, всё сломается. Лучше писать так:

xdg-mime query default inode/directory >> "/home/user/f1"

3. Лишние символы в переменных

Если после подстановки переменной появляются странные символы (вроде того же %), проверьте, нет ли пробелов или спецсимволов в значениях. Используйте printf “%q” для диагностики:

printf "%q" "$(date +%a%d% +%X)"

Совет от практика: если скрипт ведёт себя не так, как та же команда в терминале, добавьте set -x в начало – это покажет, как bash интерпретирует каждую строку.

Дополнительные нюансы работы с датами

Формат +%a%d %X выводит сокращённое название дня недели (например, «lun.» для понедельника в испанском), число месяца и время. Но будьте внимательны:

  • Локализация может влиять на вывод (например, «lun» вместо «Mon»).
  • Если нужно гарантировать английский язык, добавьте LC_TIME=en_US.UTF-8:
echo $(LC_TIME=en_US.UTF-8 date +%a%d %X)

И напоследок: если после исправления скрипта вы всё ещё видите %, проверьте, не добавлен ли он в сам файл f1 ранее. Иногда старые данные в файле могут вводить в заблуждение – очистите файл перед тестами.

Теперь вы знаете не только как убрать надоевший символ, но и как отлаживать подобные ошибки в будущем. Держите эту памятку под рукой, и пусть ваши скрипты работают как часы!

Новое
Интересное