スクリプトに「最初の世界の問題」がある場合、これはそれです。
更新しているスクリプトに次のコードがあります。
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ステートメント内にネストされているため、2つの選択肢が残っているように見えます。
EOI
を改行してインデントパターンを解除するか、私はヒアドキュメントの代替手段を用意していますが、これを回避する方法がある場合は、それが私の推奨構文です。
Here-doc演算子を<<-
に変更できます。次に、here-docと区切り文字の両方をタブでインデントできます。
#! /bin/bash
cat <<-EOF
indented
EOF
echo Done
ヒアドキュメントをインデントするためのスペースではなく、タブを使用する必要がありますであることに注意してください。つまり、上記の例はコピーしても機能しません(Stack Exchangeはタブをスペースに置き換えます)。最初のEOF
区切り文字を引用符で囲むことはできません。それ以外の場合は、パラメーター展開、コマンド置換、および算術展開は無効です。
ヒアドキュメント内でコマンドの置換とパラメーターの展開が必要ない場合は、区切り文字に先頭のスペースを追加することでタブの使用を回避できます。
$ cat << ' EOF'
> indented
> EOF
indented
$ cat << ' EOF' | sed -r 's/^ {8}//'
> unindented
> EOF
unindented
しかし、このトリックを使用してパラメーター展開を維持する方法を理解できませんでした。
これを試して:
sed 's/^ *//' >> ~/Desktop/text.txt << EOF
Load time-out reached and nothing to resume.
$(date +%T) - Transmission-daemon exiting.
EOF
うーん... --format
引数をここで使用して--printf
代わりに、ロットをパイプに渡します。また、if...fi
は複合コマンドです-含まれているすべてのコマンドが継承するリダイレクトを取ることができるため、おそらくヒアドキュメントをネストする必要はありません。
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
他のメソッドはherestringsです。
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"