Ich nehme einige Eingaben vom Benutzer entgegen und überprüfe die Details dazu.
Beispiel:
$HOME/Documents/test/one.txt
Ich nehme die obige Zeichenfolge als Eingabe und möchte abrufen one.txt
, ich muss weiter fortfahren one.txt
.
Antwort1
@Jordanm hat Ihnen bereits die kanonische Antwort gegeben, die für jede Zeichenfolge funktioniert. Wenn Sie speziell mit Pfaden arbeiten, können Sie auch die Programme basename
und verwenden dirname
:
basename - strip directory and suffix from filenames
dirname - strip last component from file name
Zum Beispiel:
$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
Antwort2
Dies ist eine häufige Aufgabe, die von einemParametererweiterungin jeder POSIX-Shell.
path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
Eine andere gängige Methode ist die Verwendung des Basename-Programms.
file=$(basename "$path")
Der einzige Nachteil besteht darin, dass ein externes Programm gestartet werden muss. Der Hauptvorteil besteht darin, dass Pfade mit einem abschließenden . richtig verarbeitet werden können /
.
Antwort3
Wenn Sie dies mit Dateinamen tun, verwenden Sie den basename
Befehl:
$ basename $HOME/Documents/test/one.txt
one.txt
Weiter:
$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt
Wenn Sie beliebige Zeichenfolgen mit beliebigen Trennzeichen trennen müssen, ist das ein bisschen Zauberei. Lesen Sie die Zeichenfolge in ein Array ein und setzen Sie das Eingabefeldtrennzeichen auf das Trennzeichen.
Hier ist ein Beispiel:
$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt