Aufteilen der Zeichenfolge im Bash-Skript

Aufteilen der Zeichenfolge im Bash-Skript

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 basenameund 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 basenameBefehl:

$ 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

verwandte Informationen