Ich muss zwei Variablen verketten, um einen Dateinamen mit einem Unterstrich zu erstellen. Nennen wir meine Variablen $FILENAME
und $EXTENSION
wo Dateinamen aus einer Datei gelesen wird.
FILENAME=Hello
EXTENSION=WORLD.txt
Jetzt...
Ich habe folgendes erfolglos versucht:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Ich bekomme immer eine seltsame Ausgabe. In der Regel steht der Unterstrich an erster Stelle.
Ich muss es sein
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
quelle
quelle
Antworten:
Sie können so etwas verwenden:
Das funktioniert auch:
quelle
echo
kann möglicherweise nicht helfen. Der zweite Befehl wurde bereits in der Frage gegeben.Ihre:
sind alle in Ordnung, so wäre:
(aber schon gar nicht so
wie es gebrauchtNAME=$(echo ${FILENAME}_${EXTENSION})
echo
und dersplit+glob
Betreiber ).wäre dasselbe gewesen wie:
as
_
(im Gegensatz zu\
oder'
) ist ein gültiges Zeichen in einem Variablennamen.Ihr Problem ist, dass Sie Zeilen hatten, die mit CRLF anstatt nur mit LF getrennt waren, was bedeutete, dass dieser variable Inhalt mit einem CR-Zeichen endete.
Das CR-Zeichen weist das Terminal beim Schreiben an, den Cursor an den Zeilenanfang zu bewegen. Also ,
Hello<CR>_WORLD.TXT<CR>
wenn an ein Terminal gesendet würde zeigen , wie_WORLD.TXT
(überschreibt dieHello
).quelle
Ich habe auf die
${FILENAME}_${EXTENSION}
oben erwähnte Syntax umgestellt .Früher habe ich verwendet,
$()
wenn ich zwei Variablen mit einem Unterstrich verketten musste. Zum Beispiel,$YYYYMMDD$()_$HHMMSS
um einen Dateinamen zu generieren, der einen Zeitstempel im Format JJJJMMTT_HHMMSS enthält. Die Mitte$()
gibt nichts zurück und zerlegt die beiden Variablen.Ich habe verwendet
time
, um die Zuweisungen mit der$YYYYMMDD$()_$HHMMSS
Methode und einigen der oben genannten zu messen , und sie haben alle 0 ms auf dem alten Server gemeldet, auf dem ich dies verwende. Leistung scheint kein Problem zu sein.quelle
$()
gibt eine Unterschale in ein paar Schalen auf (einige optimieren sie weg). Es entführt auch einen Operator für etwas, für das es nicht entwickelt wurde.${x}_y
ist was du willst.Sie sollten Variablen in Kleinbuchstaben verwenden (dies ist die beste Vorgehensweise).
Also verwende ich Dateiname und Erweiterung anstelle von FILENAME und EXTENSION
Wenn Sie sagen, dass der Dateiname aus einer Datei gelesen wird, gehe ich davon aus, dass das Skript wie folgt lautet:
Und dass Sie beide Variablen $ filename und $ extension mit einem Unterstrich verketten wollen
_
.Die von Ihnen angegebenen Beispiele (außer: no double \) funktionieren hier korrekt:
Wie einige andere:
Ihr Problem ist also nicht, wie die Variablen zusammenhalten, sondern mit dem Inhalt der Variablen. Es scheint vernünftig zu denken, dass dies:
liest einen abschließenden Wagenrücklauf,
\r
wenn aus einer Windows-Datei gelesen wird .Eine einfache Lösung (für ksh, bash, zsh) besteht darin, alle Steuerzeichen aus der gelesenen Variablen zu entfernen:
Dies könnte mit einem Wert simuliert werden, der einen Wagenrücklauf hat:
Oder ersetzen Sie den Wert von
filename
:Fazit.
Also das:
Erhält den korrekten Wert
name
auch dann, wenn die anderen Variablen Steuerzeichen enthalten.quelle
Antwort von Stéphane Chazelas :
ist natürlich die beste Antwort und sollte die akzeptierte Antwort sein. Im Sinne der Antwort von user208145 ist hier eine Alternative:
quelle
Sie können dies auch verwenden: Trennen Sie die einzelnen Variablen durch Leerzeichen und verknüpfen Sie sie mit tr, um das Leerzeichen zu entfernen.
quelle