dividindo a string no script bash

dividindo a string no script bash

Estou recebendo algumas informações do usuário e verificando detalhes sobre isso.

Exemplo:

$HOME/Documents/test/one.txt

Tomo a string acima como entrada e quero recuperá-la one.txt, preciso prosseguir one.txt.

Responder1

@Jordanm já deu a resposta canônica que funciona para qualquer string. Se você estiver lidando especificamente com caminhos, também poderá usar os programas basenamee dirname:

   basename - strip directory and suffix from filenames
   dirname - strip last component from file name

Por exemplo:

$ 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

Responder2

Esta é uma tarefa comum que pode ser realizada por umexpansão de parâmetrosem qualquer shell POSIX.

path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt

Outro método comum é usar o programa basename.

file=$(basename "$path")

A única desvantagem é ter que gerar um programa externo. Sua principal vantagem é que ele lida adequadamente com caminhos com um final /.

Responder3

Se você estiver fazendo isso com nomes de arquivos, use o basenamecomando:

$ basename $HOME/Documents/test/one.txt
one.txt

Avançar:

$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt

Se você precisar dividir strings arbitrárias com delimitadores arbitrários, é um pouco de mágica. Leia a string em uma matriz e defina o separador do campo de entrada como o delimitador.

Aqui está um exemplo:

$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt

informação relacionada