como grep um nome de variável

0

Estou escrevendo uma função bash que recebe uma entrada como um nome de arquivo e certifica-se de que ela começa com um caractere alfa, mas o grep que estou usando para testar o nome do arquivo está aceitando qualquer entrada que for dada

aqui está o meu código ...

function getname(){
fname=$1;
if [ ! $1 ]; then
        read -p "Enter a file name: " fname;
fi;
until ( grep -E '^[a-zA-Z_]\w+' <<< "$fname" > /dev/null 2>1&); do
    if [ -d $fname ]; then
            echo "Paths are not a legal file name.";
        fi;
        read -p "Enter a legal file name: " fname;
done
}

ele aceitará corretamente 1 ou nenhum parâmetro e solicitará um nome de arquivo (se nenhum parâmetro), mas aceitará qualquer string que seja passada para ele. então como eu apropriadamente grep a string armazenada como fname?

    
por mike 17.11.2017 / 01:15

2 respostas

3

Eu não usaria grep . Em vez disso, eu compararia o nome do arquivo usando o operador test interno ( [[ .. ]] ), que pode manipular expressões regulares diretamente.

function getname(){
    local fname="$1"

    [[ -z "$fname" ]] && read -p "Enter a file name: " fname

    until [[ "$fname" =~ ^[[:alpha:]] ]] && [[ -f "$fname" ]]
    do
        [[ -d $fname ]] && echo "Paths are not a legal file name."

        read -p "Enter a legal file name: " fname
    done
}
    
por 17.11.2017 / 01:24
2

Se você precisar usar grep , suspeito que o problema com sua implementação é que, em vez de 2>&1 (combinar erro padrão e saída padrão), você escreveu 2>1& (enviar erro padrão para um arquivo chamado 1 e coloque o comando no fundo do shell). Isso impede que o status de saída grep seja passado para o condicional.

FWIW você pode usar -q para sair silenciosamente, e eu não acho que você precise do subshell - você poderia simplesmente escrever

until grep -qE '^[a-zA-Z_]\w+' <<< "$fname"; do
    
por 17.11.2017 / 01:35

Tags