Bash

無法縮進 heredoc 以匹配程式碼塊的縮進

  • April 6, 2022

如果有一個腳本編寫的“第一世界問題”,那就是它。

我正在更新的腳本中有以下程式碼:

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. 保持縮進,但使用類似 echo 語句的東西來讓 mailx 接收我的電子郵件。

我對 heredoc 的替代方案持開放態度,但如果有辦法解決這個問題,這是我的首選語法。

您可以將 here-doc 運算符更改為<<-. 然後,您可以使用製表符縮進 here-doc和分隔符:

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

請注意,您必須使用 tabs而不是空格來縮進 here-doc。這意味著上面的範例將無法複製(Stack Exchange 將製表符替換為空格)。第一個分隔符周圍不能有任何引號EOF,否則參數擴展、命令替換和算術擴展無效。

如果您不需要在此處文件中進行命令替換和參數擴展,則可以通過將前導空格添加到分隔符來避免使用製表符:

$     cat << '    EOF'
>         indented
>     EOF
       indented
$     cat << '    EOF' | sed -r 's/^ {8}//'
>         unindented
>     EOF
unindented

不過,我想不出一種方法來使用這個技巧並保持參數擴展。

引用自:https://unix.stackexchange.com/questions/76481