Ter regex no script Bash

2

O script bash faz muitas coisas. No entanto, no início, deve começar se a entrada passada para o script for um caminho de diretório. Por exemplo, maneira correta de dizer o caminho do diretório é "/ var / lib / test", e maneira incorreta é "/ var / %% ^? / teste".

em que test é um diretório e não um arquivo.

O caminho do diretório pode conter caracteres. [A-Za-z0-9 / _-]

Meu script é como abaixo -

#!/bin/bash
dirPath="/var/lib/test"
if [[ ! ${dirPath} =~ "^/[A-Za-z0-9/_-]+$" ]]; then
    echo "Success"
else
    echo "Failure"
fi

Aqui, o dirPath pode ter qualquer caminho fornecido a partir de outro script.

por favor, deixe-me saber o erro aqui.

    
por user7290726 28.09.2018 / 13:39

4 respostas

4
if [[ ! ${dirPath} =~ "^/[A-Za-z0-9/_-]+$" ]]; then
    echo "Success"

Isso testará $dirPath na sequência literal ^/[A-Za-z0-9/_-]+$ e inverterá o resultado. Em outras palavras, imprimirá Success quando $dirPath for qualquer coisa diferente daquela cadeia literal. Isso ocorre porque os caracteres citados em um regex perdem seu significado especial nas versões atuais do Bash e, é claro, o ! trabalha para inverter o teste.

Se você quiser testar essa variável com relação à regex atual, é mais fácil colocar a regex em uma variável primeiro e deixá-la sem aspas (usar uma variável pode não ser estritamente necessário, mas evita alguns problemas de análise com expressões regulares complexas):

dirPath="/var/lib/test"
re='^/[A-Za-z0-9/_-]+$'
if [[ ${dirPath} =~ $re ]]; then
    echo "'$dirPath' starts with a slash, and is composed of alphanumerics, hyphens, underscores and slashes only"
else
    echo "'$dirPath' is of a forbidden format"
fi

Claro, se você quiser testar se esse caminho é um diretório existente, use -d :

if [[ -d $dirPath ]]; then
    echo "'$dirPath' exists and is a directory
fi
    
por 28.09.2018 / 14:15
4

Remova as aspas da regex:

[[ ! "${dirPath}" =~ ^/[A-Za-z0-9/_-]+$ ]]

Citando a regex força a correspondência de strings desde Bash 3.2 .

Compare esta pergunta no Stackoverflow .

Note: while this fixes your script, it does not properly check if the path is a correct directory path. Refer to @Kusalanandas answer how to do a proper check.

    
por 28.09.2018 / 13:55
2

Esta resposta se concentra na primeira parte da pergunta que (atualmente) diz:

However, at beginning it should start if the input passed to the script is a directory path.

O resto da questão é uma tentativa de fazer isso, combinando uma determinada expressão regular contra um nome de caminho para tentar descobrir se é um nome de caminho de diretório válido.

Um script geralmente não deve impor um esquema de nomenclatura arbitrário nos diretórios ou arquivos do usuário sem motivo. O nome do caminho /var/%%^?/test é perfeitamente válido em um sistema no qual existe um diretório chamado %%^? em /var e em que esse diretório contém um subdiretório chamado test .

O que seu script está realmente preocupado é se ele recebe um nome de caminho para um diretório existente . Qualquer que seja o caminho do diretório é menos importante.

Isso pode ser feito com

#!/bin/bash

dirPath=$1

if [ ! -d "$dirPath" ]; then
    printf '"%s" is not a valid directory path\n' "$dirPath" >&2
    exit 1
fi

Após esse if -statement, você sabe que "$dirPath" é o caminho para um diretório existente. O nome do caminho para o diretório é (no código acima) retirado do primeiro argumento de linha de comando.

    
por 28.09.2018 / 14:03
0

para verificar se o seu arquivo ou diretório não é necessário regex - use:

if [ -d "${testpath}" ] ; then
    echo "$testpath is a directory";
    
por 28.09.2018 / 15:34