O que significa “FILENAME = $ (echo $ INFILE | grep -oE” [^ /] + $ “)”?

1
FILENAME=$(echo /root/Source/code/script.sh | grep -oE "[^/]+$")

Eu sei que me daria o nome do arquivo do caminho do arquivo aqui como script.sh . Mas alguém pode me explicar isso?

    
por akasb 28.02.2014 / 20:48

3 respostas

2

-o significa: Imprima apenas as partes correspondentes (não vazias) de uma linha correspondente, com cada uma dessas partes em uma linha de saída separada.

[^/]+$ significa: Corresponda o máximo possível de caracteres à direita que não contenham uma barra. Esse é o nome do arquivo sem os diretórios principais.

Geralmente isso é feito com:

basename /root/Source/code/script.sh
    
por 28.02.2014 / 20:55
5

Vamos contar o número de erros em:

FILENAME=$(echo $INFILE | grep -oE "[^/]+$")
  1. echo não deve ser usado para dados arbitrários . Dependendo da implementação, ele falhará se $INFILE começar com - ou contiver barras invertidas ou ambas.
  2. Deixar uma variável sem aspas é o operador split + glob . Isso fará com que o acima falhe por muitos valores possíveis de $INFILE . As variáveis nunca devem ser deixadas sem aspas, a menos que você tenha uma boa razão para não fazê-lo.
  3. grep funciona em cada linha de sua entrada, enquanto aqui você quer que ele faça apenas a cadeia inteira.
  4. Se $INFILE for /some/dir/ ou / , isso retornará a string vazia em vez de dir ou / .
  5. A opção -o é específica do GNU, então só funcionará onde grep é o GNU grep .
  6. cosmético / convenção: todos os nomes de variáveis de letras maiúsculas devem ser reservados para variáveis de ambiente.
  7. A substituição de comandos
  8. remove os caracteres de nova linha à direita, portanto, o acima não funcionará se $INFILE terminar em caracteres de nova linha.

Para obter o nome base de um arquivo, há um comando padrão para isso:

filename=$(basename -- "$infile")

Ou para evitar (7) acima:

filename=$(basename -- "$infile"; echo .); filename=${filename%??}

Ou usando operadores de expansão de shell:

filename=${infile##*/}

(ainda tem problema (4) acima).

    
por 28.02.2014 / 21:58
3

[^/]+$ é uma Expressão Regular para "Um ou mais de qualquer caractere que não seja uma barra, seguido pelo final da string testada". A string que está sendo testada é /root/Source/code/script.sh ; a parte dessa string que corresponde ao padrão é script.sh . grep -o retorna apenas o padrão correspondente e não a linha inteira correspondente.

    
por 28.02.2014 / 20:55