Bra*_*ley 92 shell bash shell-script here-document
如果脚本编写存在“第一世界问题”,那就是它。
我正在更新的脚本中有以下代码:
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
Run Code Online (Sandbox Code Playgroud)
该脚本发送电子邮件没有问题,但 mailx 命令嵌套在 if 语句中,因此我似乎有两个选择:
EOI一个新的生产线,打破花纹或我对heredoc的替代品持开放态度,但如果有办法解决这个问题,这是我的首选语法。
cho*_*oba 154
您可以将 here-doc 运算符更改为<<-. 然后,您可以使用制表符缩进 here-doc和分隔符:
#! /bin/bash
cat <<-EOF
indented
EOF
echo Done
Run Code Online (Sandbox Code Playgroud)
请注意,您必须使用 tabs而不是空格来缩进 here-doc。这意味着上面的示例将无法复制(Stack Exchange 用空格替换制表符)。第一个EOF分隔符周围不能有任何引号,否则参数扩展、命令替换和算术扩展无效。
its*_*dok 15
如果您的 here-document 中不需要命令替换和参数扩展,则可以通过将前导空格添加到分隔符来避免使用制表符:
$ cat << ' EOF'
> indented
> EOF
indented
$ cat << ' EOF' | sed -r 's/^ {8}//'
> unindented
> EOF
unindented
Run Code Online (Sandbox Code Playgroud)
不过,我想不出使用这个技巧并保持参数扩展的方法。
小智 5
尝试这个:
sed 's/^ *//' >> ~/Desktop/text.txt << EOF
Load time-out reached and nothing to resume.
$(date +%T) - Transmission-daemon exiting.
EOF
Run Code Online (Sandbox Code Playgroud)