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
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
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 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.