Die eigentliche Frage ist, warum Betriebssysteme in '.' ? Es gibt keinen technischen Grund dafür, es ist nur ein Standard, mit dem Sie den Dateityp ohne Überprüfung annehmen können.
Wenn Sie eine MP3-Datei in .txt umbenennen und versuchen, sie in Windows zu öffnen, werden Sie sofort erkennen, warum diese Idee Nachteile hat: Sie können die Datei plötzlich nicht mehr richtig öffnen. Technisch gesehen besteht der "beste" Weg ohne Geschwindigkeitsüberlegungen usw. wahrscheinlich darin, den Dateityp zu bestimmen, bevor entschieden wird, was damit zu tun ist, da Erweiterungen leicht gefummelt werden und Probleme verursachen können.
Der Grund, warum Linux sich nicht für einen Punkt im Namen interessiert, ist der gleiche Grund, warum eine Nicht-Computer-Person dies nicht tut: Es gibt keinen inhärenten Unterschied zwischen einem Punkt und einem anderen Zeichen außer der Tatsache, dass einige Programme zufällig codiert sind, um sie zu sehen diese Zeit und behandeln Sie es speziell.
Angenommen, Sie möchten tatsächlich nur die Erweiterung (was nicht bei beiden Snippets der Fall ist), könnten Sie Folgendes verwenden:
ext(){
extension=
[[ $1 =~ \. ]] && extension="${1##*.}"
echo "$1 -> ${extension:-No extension}"
}
ext something. # something. -> No extension
ext something.txt # something.txt -> txt
ext something # something -> No extension
ext som.thing.mp3 # som.thing.mp3 -> mp3
ext .whatever # .whatever -> whatever
* Beachten Sie den letzten.
Wenn Sie den Dateinamen selbst zurückgeben möchten, wenn keine Erweiterung vorhanden ist, wie dies bei Ihrem Code der Fall ist, gibt es keinen Grund, das lange zweite Snippet im SH-Stil zu verwenden. Du hast geschrieben:
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
Welches ist eigentlich nur:
ext(){
extension="${1##*.}"
# This line is what your first snippet is doing:
# echo "$extension"
# This line is what your second snippet is doing:
[[ $extension ]] && echo "$extension" || echo "$1"
}
Welches ist eigentlich nur:
# First snippet
ext(){
echo "${1##*.}"
}
# Second snippet
ext(){
extension="${1##*.}"
echo "${extension:-$1}"
}
Sie können nichts für selbstverständlich halten, was Benutzer grundsätzlich eingeben können. Wenn Sie sehen möchten, um welche Art von Datei es sich tatsächlich handelt, versuchen Sie den Befehl file. Da das Parsen von Dateinamen, um den Dateityp herauszufinden, nicht die einzige Möglichkeit ist, diese Katze zu häuten. Sie können unter Linux sogar einen Dateinamen namens einfach haben: \
example.tar.gz
angeben, werden alle Suffixe ab dem ersten Punkt entfernt, wodurch nicht die einzige Erweiterung erhalten wird, die zum Aufrufen des richtigen Programms für die Verarbeitung erforderlich ist. Wenn Ihr Dateiname keine (durch Punkte getrennte) "Erweiterung (en)" hat, druckt Ihre Funktion den gesamten eingegebenen Namen. In diesem Fall benötigen Sie einen zusätzlichen Test, um eine leere Zeichenfolge zurückzugeben.