Não é possível indentar heredoc para corresponder ao recuo do aninhamento

56

Se houver um "Primeiro Problema Mundial" para o script, seria isso.

Eu tenho o seguinte código em um script que estou atualizando:

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

O script envia e-mails sem problemas, mas o comando mailx está aninhado em uma instrução if, portanto, parece que tenho duas opções:

  1. Coloque EOI em uma nova linha e quebre padrões de recuo ou
  2. Mantenha o recuo, mas use algo como uma declaração echo para fazer com que o mailx sugue meu e-mail.

Estou aberto a alternativas para heredoc, mas se houver uma maneira de contornar isso, é minha sintaxe preferida.

    
por Bratchley 20.05.2013 / 19:47

5 respostas

101

Você pode alterar o operador here-doc para <<- . Você pode, então, recuar tanto o aqui-doc quanto o delimitador com abas:

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

Note que você deve usar abas , não espaços para recuar o aqui-doc. Isso significa que o exemplo acima não funcionará copiado (o Stack Exchange substitui as guias por espaços). Não pode haver nenhuma aspas ao redor do primeiro delimitador EOF , senão a expansão do parâmetro, a substituição do comando e a expansão aritmética não estão em vigor.

    
por 20.05.2013 / 19:54
4

Tente isto:

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

Se você não precisa de substituição de comandos e expansão de parâmetros dentro de seu documento aqui, é possível evitar o uso de guias adicionando os espaços iniciais ao delimitador:

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

Eu não consegui descobrir uma maneira de usar esse truque e manter a expansão dos parâmetros.

    
por 07.04.2018 / 13:10
2

Hmm ... Parece que você poderia aproveitar melhor o argumento --format aqui para usar --printf e passar o lote por um pipe. Além disso, o seu if...fi é um comando composto - pode ter um redirecionamento que todos os comandos contidos herdarão, então talvez você não precise aninhar o heredoc.

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
    
por 27.01.2015 / 16:53
0

O outro método seria 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"
    
por 27.01.2015 / 15:41