Was ist los mit dem folgenden Code?
name='$filename | cut -f1 -d'.''
So wie es ist, bekomme ich die Literalzeichenfolge $filename | cut -f1 -d'.'
, aber wenn ich die Anführungszeichen entferne, bekomme ich nichts. In der Zwischenzeit tippen
"test.exe" | cut -f1 -d'.'
in einer Shell gibt mir die Ausgabe, die ich will , test
. Ich weiß bereits, dass $filename
der richtige Wert zugewiesen wurde. Ich möchte einer Variablen den Dateinamen ohne die Erweiterung zuweisen.
basename $filename .exe
würde das gleiche tun. Vorausgesetzt, Sie wissen immer, welche Erweiterung Sie entfernen möchten.basename "$filename" .exe
. Andernfalls wären Dateinamen mit Leerzeichen eine schlechte Nachricht.Antworten:
Sie sollten die unter Verwendung von Befehlsersetzung Syntax ,
$(command)
wenn Sie einen Befehl in / script Befehl ausgeführt werden sollen.Also wäre deine Linie
Code-Erklärung:
echo
Holen Sie sich den Wert der Variablen$filename
und senden Sie ihn an die Standardausgabecut
Befehl weitercut
wird die verwenden. als Trennzeichen (auch als Trennzeichen bezeichnet) zum Schneiden des Strings in Segmente und durch-f
Auswählen des Segments, das in der Ausgabe enthalten sein soll$()
erhält die Befehlssubstitution die Ausgabe und gibt ihren Wert zurückname
Beachten Sie, dass dies den Teil der Variablen bis zur ersten Periode angibt
.
:quelle
echo $filename | cut -f1 -d'.'
$()
mehr unterstützt.Sie können auch die Parametererweiterung verwenden:
quelle
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Vielen Dank.image.png.gz
?%.*
entfernt nur die letzte Erweiterung; Wenn Sie alle Erweiterungen entfernen möchten , verwenden Sie%%.*
.Wenn Sie die Erweiterung kennen, können Sie den Basisnamen verwenden
quelle
.wiki
und am Ende mit/home/jsmith/base
?Wenn Ihr Dateiname einen Punkt enthält (außer dem der Erweiterung), verwenden Sie diesen:
quelle
-s
Option angegeben wirdcut
, sodass eine leere Zeichenfolge zurückgegeben wird, wenn der Dateiname keinen Punkt enthält.Verwenden Sie, was Sie wollen. Hier gehe ich davon aus, dass der letzte
.
(Punkt) gefolgt von Text eine Erweiterung ist.quelle
Ausgänge:
Beachten Sie, dass nur die letzte Erweiterung entfernt wird.
quelle
Meine Empfehlung ist zu verwenden
basename
.Es ist standardmäßig in Ubuntu visuell einfacher Code und behandelt die meisten Fälle.
Hier sind einige Unterfälle, die sich mit Leerzeichen und Mehrpunkt- / Untererweiterungen befassen:
Normalerweise wird die Erweiterung von Anfang an
.
beseitigt, aber auf unserem..
Weg scheitert sieHier ist ein wichtiger Hinweis:
Sie müssen jedoch noch daran denken
.hidden_files
nicht das erwartete "" Ergebnis. Um dies zu ermöglichen, verwenden Sie
$HOME
oder/home/user_path/
weil bash wieder "ungewöhnlich" ist und erweitern Sie nicht "~" (suchen Sie nach bash BashPitfalls)
quelle
Ausgänge:
quelle
Wie Hawker65 im Kommentar der Antwort von chepner hervorhob, kümmert sich die am häufigsten gewählte Lösung weder um mehrere Erweiterungen (wie filename.tar.gz) noch um Punkte im Rest des Pfades (wie this.path / with) .dots / in.path.name). Eine mögliche Lösung ist:
quelle
Zwei Probleme mit Ihrem Code:
Ich würde Ihren Code in "name =` echo $ filename | cut -f 1 -d 'ändern. " `", wie unten gezeigt (beachten Sie erneut die hinteren Häkchen, die die Definition der Namensvariablen umgeben):
quelle