Linux - Correspondência de Padrões
Os operadores de correspondência de padrões (pattern matching) permitem encontrar um padrão em uma variável e, se encontrado, modificar essa variável. Os operadores são os seguintes:
- O operador
##
é usado para encontrar a correspondência mais longa com o padrão desde o início da string. - O operador
#
é usado para encontrar a correspondência mais curta com o padrão desde o início da string. - O operador
%%
é usado para encontrar a correspondência mais longa com o padrão desde o final da string. - O operador
%
é usado para encontrar a correspondência mais curta com o padrão desde o final da string.
Vamos definir no diretório pessoal o seguinte script hello
:
#!/bin/bash # script que obtém o nome do arquivo filename=${1##*/} echo "The filename is $filename" exit 0
Neste caso, a busca pelo padrão é aplicada ao identificador $1
: o primeiro argumento passado ao script pela linha de comando. O operador ##
é aplicado a este argumento, buscando a correspondência mais longa com o padrão */
. Ou seja, o operador busca /
, precedido por qualquer outro caractere *
. Como o operador ##
busca a correspondência mais longa, ele procura o último /
na string e o remove, junto com tudo que o precede. Assim, do caminho completo do arquivo, obtemos apenas o nome do arquivo.
Execute o script e passe o caminho completo de um arquivo:
programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt The filename is hello.txt
Usando o operador #
, podemos encontrar a correspondência mais curta. Por exemplo, vamos alterar o script da seguinte forma:
#!/bin/bash # script que obtém o nome do arquivo path=${1#*/} echo "path: $path" exit 0
Execute o script, passando o caminho do arquivo:
programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt path: home/programicio/Documents/hello.txt
Neste caso, o operador busca o primeiro caractere /
no nome completo do arquivo e o remove, junto com tudo que o precede. É importante entender o papel do *
nesses exemplos. O operador ${1#*/}
remove o primeiro caractere /
encontrado e tudo que o precede. O operador ${1#/}
remove o primeiro caractere /
em $1
, apenas se o valor de $1
começar com /
. No entanto, se houver algo antes de /
, o operador não saberá o que fazer.
Outro exemplo, obteremos o caminho relativo do arquivo:
#!/bin/bash # script que obtém o caminho relativo do arquivo rel_path=${1#$PWD/} echo "Relative path: $rel_path" exit 0
Aqui, o padrão de busca é estabelecido com base na variável $PWD
e o caractere /
. Execute o script e passe o caminho absoluto completo do arquivo:
programicio@Programicio:~$ echo $PWD /home/programicio programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt Relative path: Documents/hello.txt
Os operadores %%
e %
são semelhantes, mas buscam a correspondência desde o final da string. Por exemplo, vamos alterar o script da seguinte forma:
#!/bin/bash # script que obtém o diretório do arquivo dirname=${1%/*} echo "Directory: $dirname" exit 0
Neste caso, o operador ${1%/*}
busca o primeiro barra /
desde o final (ou a última barra desde o início), após a qual há qualquer caractere. E toda a parte da string a partir desta barra é removida. Assim, obtemos o diretório do arquivo. Execute o script e passe o caminho completo de um arquivo:
programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt Directory: /home/programicio/Documents