Bash
無法縮進 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 語句中,因此我似乎有兩個選擇:
- 換
EOI
行並打破縮進模式或- 保持縮進,但使用類似 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
不過,我想不出一種方法來使用這個技巧並保持參數擴展。