Como manipular o caractere de espaço na entrada do usuário

0

Comecei recentemente a trabalhar com scripts do Shell. Então, eu estou enfrentando um problema que quando eu estou tomando o nome do arquivo como uma entrada do usuário, então se eu der espaços, então não é tratado com o meu código. Quaisquer respostas para o mesmo

Meu código é assim:

echo "---------------- Please provide the filename -------------------------"
read filename
if [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
    printf "some code "
else 
    printf "some code"
fi

Alguém por favor pode me ajudar como eu posso lidar com o caractere de espaço para que, se o espaço for fornecido no parâmetro de entrada, ele deva dar algum erro.

Obrigado

    
por user163610 31.03.2016 / 12:04

2 respostas

1

Você pode verificar isso com o regex:

O código inteiro ficaria assim:

if [[ $filename =~ \  ]]; then
    printf "error"
    exit(1)
elif [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
    printf "some code "
else 
    printf "some code"
fi
    
por 31.03.2016 / 12:33
1

Por que você está restringindo o nome do arquivo? Na maioria dos sistemas de arquivos, os nomes dos arquivos Unix podem conter qualquer caractere, exceto NUL (\ 0) e barra (/). É melhor você aprender agora como lidar com nomes de arquivos incomuns do que ter o hábito de esperar apenas letras e dígitos como você fez, e ser mordido mais tarde quando se deparar com algo inesperado.

Sugiro fazer algumas leituras sobre como lidar com nomes de arquivos com espaços e outros caracteres estranhos.

A primeira dica é sempre usar aspas duplas em torno de suas variáveis. Há casos em que você não precisa, mas, para um iniciante, é mais fácil fazer isso sempre. Só isso provavelmente resolverá o problema específico que você está tentando resolver agora.

A próxima coisa que eu recomendaria é ler e aprender a amar o comando find e, em particular, o operador -exec . Isso torna mais fácil fazer a coisa certa ao operar em uma árvore de diretórios inteira. Por exemplo, nunca faça isso:

for f in *; do
    do-something-with-a-file "$f"
done

Isso não funcionará corretamente se algum dos arquivos tiver espaços, tabulações ou novas linhas em seus nomes (os nomes dos arquivos sim podem conter novas linhas!). Não só isso, mas não permite distinguir entre arquivos e diretórios.

Em vez disso, faça isso:

find -maxdepth 1 -type f -exec do-something-with-a-file {} \;

O operador -maxdepth limita os resultados apenas àqueles no diretório atual, -type f informa find que queremos apenas arquivos, não diretórios, e -exec somecommand {} \; executa somecommand uma vez para cada arquivo, passando o nome do arquivo (citado corretamente) no lugar de {} . A barra invertida antes do ponto-e-vírgula é para o shell, para que o shell não processe o ponto-e-vírgula e, em vez disso, passe para o comando find .

Este é apenas um início rápido no tratamento adequado de nomes de arquivos. Por favor, leia um pouco sobre o assunto , e poste mais perguntas aqui se você ficar preso.

    
por 31.03.2016 / 14:01

Tags