Se houver um "Problemas do Primeiro Mundo" para scripts, seria esse.
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 email sem problemas, mas o comando mailx está aninhado em uma instrução if, portanto, pareço ter duas opções:
- Coloque
EOI
uma nova linha e quebre os padrões de indentação ou - Mantenha o recuo, mas use algo como uma declaração de eco para obter o mailx para sugar o meu email.
Estou aberto a alternativas ao heredoc, mas se houver uma maneira de contornar isso, é a minha sintaxe preferida.
fonte
$dateLastChanged
) se eu fizer a coisa hypen + quote no seu exemplo, mas se eu pegar o hífen e as aspas e colocar EOI em um nova linha ele começa a expandi-lo novamente.cat << EOF | sed 's/^ *//'
e assim por diante.cat <<- EOF | awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {print substr($0, n+1)}'
. Isso remove a quantidade de espaços anteriores na primeira linha de todas as linhas do documento aqui (graças ao anubhava ).Se você não precisar de substituição de comando e expansão de parâmetro no documento aqui, poderá evitar o uso de guias adicionando os espaços iniciais ao delimitador:
Mas não consegui descobrir uma maneira de usar esse truque e manter a expansão dos parâmetros.
fonte
shell-check
encontrará alterações de recuo que não correspondam aos espaços na cadeia de caracteres citada. Use aspas duplas para a expansão de parâmetros?Tente o seguinte:
fonte
Hmm ... Parece que você poderia aproveitar melhor o
--format
argumento aqui para usar--printf
e apenas passar o lote por um cano. Além disso, vocêif...fi
é um comando composto - pode ser necessário um redirecionamento que todos os comandos contidos herdarão, portanto, talvez você não precise aninhar o heredoc.fonte
sed
/awk
parte. Parte da minha revisão hoje foi removê-la, pois não era pertinente à questão. De qualquer maneira, são seis de meia dúzia da outra.O outro método seria herestrings:
fonte