Wenn es ein "First World Problems" für das Scripting gibt, wäre dies das Richtige.
Ich habe den folgenden Code in einem Skript, das ich aktualisiere:
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
Das Skript sendet E-Mails ohne Probleme, aber der Befehl mailx ist in einer if-Anweisung verschachtelt, sodass mir anscheinend zwei Möglichkeiten verbleiben:
- Setzen Sie
EOI
eine neue Zeile und brechen Sie die Einrückungsmuster oder - Behalten Sie die Einrückung bei, aber verwenden Sie so etwas wie eine Echo-Anweisung, damit mailx meine E-Mails aufnimmt.
Ich bin offen für Alternativen zu heredoc, aber wenn es einen Weg gibt, dies zu umgehen, ist es meine bevorzugte Syntax.
quelle
$dateLastChanged
einfügen möchte ( ), wenn ich in Ihrem Beispiel den Bindestrich + Anführungszeichen mache, sondern wenn ich den Bindestrich und die Anführungszeichen herausnehme und EOI auf a setze neue Zeile beginnt es wieder zu erweitern.cat << EOF | sed 's/^ *//'
und so weiter.cat <<- EOF | awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {print substr($0, n+1)}'
. Dadurch wird die Anzahl der vorangestellten Leerzeichen in der ersten Zeile aus jeder Zeile des Here-Dokuments entfernt (dank anubhava ).Wenn Sie in Ihrem Here-Dokument keine Befehlssubstitution und Parametererweiterung benötigen, können Sie die Verwendung von Tabulatoren vermeiden, indem Sie die führenden Leerzeichen zum Trennzeichen hinzufügen:
Ich konnte jedoch keine Möglichkeit finden, diesen Trick anzuwenden und die Parametererweiterung beizubehalten.
quelle
shell-check
findet alle Einrückungsänderungen, die nicht mit den Leerzeichen in der angegebenen Zeichenfolge übereinstimmen. Verwenden Sie doppelte Anführungszeichen für die Parametererweiterung?Versuche dies:
quelle
Hmm ... Scheint, als könntest du das
--format
Argument hier besser nutzen , um es--printf
stattdessen zu verwenden und das Los einfach über ein Rohr zu leiten. Außerdem handelt es sich bei Ihremif...fi
Befehl um einen zusammengesetzten Befehl. Es kann eine Umleitung erforderlich sein, die von allen enthaltenen Befehlen übernommen wird, sodass Sie den heredoc möglicherweise überhaupt nicht verschachteln müssen.quelle
sed
/awk
Teil nichts ausmacht . Ein Teil meiner heutigen Überarbeitung bestand darin, es herauszunehmen, da es für die Frage nicht von Belang war. So oder so ist es sechs von einem halben Dutzend des anderen.Die andere Methode wäre Herestrings:
quelle