Нельзя отступать heredoc, чтобы соответствовать отступу вложенности

Если для сценариев есть «проблемы первого мира», это будет именно так.

У меня есть следующий код в скрипте, который я обновляю:

if [ $diffLines -eq 1 ]; then dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g') mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G Blackboard Snapshot process. EOI else echo "$diffLines have changed" fi 

Скрипт отправляет электронную почту без проблем, но команда mailx вложена в оператор if, поэтому мне кажется, что осталось два варианта:

  1. Поместите EOI на новую строку и отломите шаблоны отступов или
  2. Продолжайте с отступом, но используйте что-то вроде выражения эха, чтобы почтовый ящик втянул мой адрес электронной почты.

Я открыт для альтернатив heredoc, но если есть способ обойти это, это мой предпочтительный синтаксис.

4 Solutions collect form web for “Нельзя отступать heredoc, чтобы соответствовать отступу вложенности”

Вы можете изменить оператор here-doc на <<- . Затем вы можете отступать как здесь-документ, так и разделитель с вкладками:

 #! /bin/bash cat <<-EOF indented EOF echo Done 

Обратите внимание, что вы должны использовать вкладки , а не пробелы, чтобы отступать здесь-doc. Это означает, что приведенный выше пример не будет скопирован (Stack Exchange заменяет вкладки пробелами). Не может быть никаких кавычек вокруг первого разделителя EOF , иначе расширение параметра, подстановка команд и арифметическое расширение не действуют.

Попробуй это:

 sed 's/^ *//' >> ~/Desktop/text.txt << EOF Load time-out reached and nothing to resume. $(date +%T) - Transmission-daemon exiting. EOF 

Хм … Похоже, вы могли бы лучше воспользоваться аргументом --format здесь, чтобы использовать --printf вместо этого и просто передать лот над трубой. Кроме того, ваш if...fi является составной командой – он может принимать перенаправление, которое все содержащиеся в нем команды наследуют, поэтому, возможно, вам вообще не нужно вставлять heredoc.

 if [ "$diffLines" = 1 ] then stat --printf "Last Change: %.19y\n\n$(cat)\n" /.bbdata | mailx -r "Systems and Operations <sysadmin@[redacted].edu>" \ -s "Warning Stale BB Data" 'jadavis6@[redacted].edu' else echo "$diffLines have changed" fi <<\STALE This is an automated warning of stale data for the UNC-G Blackboard Snapshot process. STALE 

Другим методом было бы удержание:

  mail_content="Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G Blackboard Snapshot process." mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<<"$mail_content" 
  • Как избежать повторения команд sed при добавлении сайтов в лак?
  • Нужен скрипт для автоматизации конвертирования большого количества аудиофайлов в другой формат
  • Создание сетевых конфигурационных файлов с помощью sed и bash
  • как изменить один столбец и добавить другие столбцы в строке awk
  • Ubuntu 14.04 Скрипт HDMI UDev
  • Что я делаю неправильно, пытаясь написать сценарий bash, который возвращает номер следующего доступного порта?
  • Расширение имени файла для сценария ожидания в bash
  • Мой файл backup_system.sh не запускался под crontab
  • Как передать аргумент из сценария bash в 'x-terminal-emulator -e bash -c'?
  • Объединить файлы с двумя столбцами в один файл
  • Сценарий OSX bash для запуска один раз на Terminal.app open
  • Linux и Unix - лучшая ОС в мире.