Ich habe eine Zeichenfolge, die das Ergebnis einer Operation ist, über die ich keine Kontrolle habe. Wenn ich diese Variable mit drucke echo
, erhalte ich:
echo $myvar
hello
Wenn ich es jedoch tue
if [ $myvar = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
Ich verstehe immer, dass sie nicht gleich sind. Ich vermute, das liegt an einem newline
Charakter.
Die Zeichenfolge verhält sich auch seltsam. Wenn ich es tue:
newVAR="this is my var twice: "$myvar$myvar
echo $newVAR
Ich bekomme:
hellois my var twice: hello
Wie kann ich überprüfen, ob dies tatsächlich auf a zurückzuführen ist, newline
und es gegebenenfalls entfernen?
printf '%q\n' "$string"
Sie eine Escape-Version einer beliebigen Zeichenfolge abrufen. Zum Beispiel:printf '%q\n' 'foo\n'
->foo\\n
;printf '%q\n' $'foo\n'
->$'foo\n'
echo $foo
. Tun Sieecho "$foo"
stattdessen.Antworten:
Das Problem ist, dass Sie einen eingebetteten Carriage-Return (CR,
\r
) haben. Dies führt dazu, dass die Texteinfügemarke des Terminals an den Anfang der zu druckenden Zeile zurückgesetzt wird. Aus diesem Grund sehen Sie in Ihrem$newVAR
Beispiel das "Hallo" am Anfang der Zeile -sed -n l
zeigt eine lesbare Ansicht der nicht druckbaren Zeichen (und des Zeilenende) an.Sie können dies mit einer einfachen Bash-Bedingungsprüfung testen:
Sie können den Test und die Korrektur in einem Schritt kombinieren, indem Sie auf
\r
(s) testen und diese entfernen über:Das Update verwendet die Shell-Parametererweiterung . Die oben verwendete spezielle Form dient zum Ersetzen von Teilzeichenfolgen basierend auf Ihrem angegebenen Muster:
${parameter/pattern/string}
<- Dies ersetzt nur das zuerst gefundene Muster durch eine Zeichenfolge in der Variablen * parameter. Um alle Muster zu ersetzen , müssen Sie nur das erste/
in ändern//
.quelle
fix="....
Linie?fix
kann sichvar
selbst sein - oder oft können Sie einfach die ParametererweiterungSie können
\r
wie$'\r'
in Bash darstellen:Oder hacken Sie den letzten
\r
inmyvar
:quelle
Seltsamerweise ist in vielen Muscheln
getopts
ein sehr wahrscheinlicher Kandidat für einen Job wie diesen. Dies mag zunächst nicht intuitiv erscheinen, aber wenn Sie bedenken, dassgetopts
die Hauptfunktion darin besteht, so viele bestimmte Befehlszeilenoptionen für einzelne Zeichen zu erkennen und zur Interpretation anzubieten, wie sie in einer verketteten Reihe derselben enthalten sind, kann dies zu einer gewissen Beeinträchtigung führen mehr Sinn.Um zu demonstrieren, aus einer
bash
Shell:Auf diese Weise kann es manchmal zweckmäßig sein,
getopts
die Demontage in solchen Fällen als eine Art Shell-Autopilot zu handhaben. Wenn Sie dies tun, können Sie einfach unerwünschte Bytes mit a aussortierencase
oder Ihre String-Sicherung aus Byte 1[
testen]
und erstellen:In Anbetracht dieses einfachen Beispielfalls - und einer Shell, die die bereits an anderer Stelle erwähnten Parametererweiterungen unterstützt - werden diese Erweiterungen Ihnen hier wahrscheinlich besser dienen. Aber ich dachte, es
getopts
könnte auch eine Erwähnung wert sein, falls Sie sich dessen in dieser Hinsicht nicht bewusst sind. Als ich davon erfuhr, fand ich jedenfalls viele nützliche Anwendungen dafür.quelle
Während Bash und andere Shell-Sprachen praktisch sind, ist es manchmal besser, eine echte Skriptsprache wie Perl zu verwenden. Perl kann Shell-Skripte, die andere Sprachen wie sed und awk aufrufen, sowie UNIX-Befehle ganz einfach ersetzen. Ich habe dies vor über 20 Jahren gelernt, als ich C-Shell-Skripte schrieb, die wiederum sed, awk und verschiedene UNIX-Befehle aufriefen - bevor ich FORTRAN-Code aufrief. In Perl würde ich tun:
quelle