Нельзя отступать 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, но если есть способ обойти это, это мой предпочтительный синтаксис.

Вы можете изменить оператор 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"