web-dev-qa-db-ja.com

ヒアドキュメントをネストのインデントと一致するようにインデントできません

スクリプトに「最初の世界の問題」がある場合、これはそれです。

更新しているスクリプトに次のコードがあります。

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つの選択肢が残っているように見えます。

  1. EOIを改行してインデントパターンを解除するか、
  2. インデントのままにしますが、echoステートメントのようなものを使用して、mailxにメールを吸い込ませます。

私はヒアドキュメントの代替手段を用意していますが、これを回避する方法がある場合は、それが私の推奨構文です。

66
Bratchley

Here-doc演算子を<<-に変更できます。次に、here-docと区切り文字の両方をタブでインデントできます。

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

ヒアドキュメントをインデントするためのスペースではなく、タブを使用する必要がありますであることに注意してください。つまり、上記の例はコピーしても機能しません(Stack Exchangeはタブをスペースに置き換えます)。最初のEOF区切り文字を引用符で囲むことはできません。それ以外の場合は、パラメーター展開、コマンド置換、および算術展開は無効です。

124
choroba

ヒアドキュメント内でコマンドの置換とパラメーターの展開が必要ない場合は、区切り文字に先頭のスペースを追加することでタブの使用を回避できます。

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

しかし、このトリックを使用してパラメーター展開を維持する方法を理解できませんでした。

6
itsadok

これを試して:

sed 's/^ *//' >> ~/Desktop/text.txt << EOF
    Load time-out reached and nothing to resume.
    $(date +%T) - Transmission-daemon exiting.
EOF
5
robz

うーん... --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
2
mikeserv

他のメソッドは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"
0
muru