|
From: | Minis novais MN |
Subject: | Re: [shell-script-pt] Expansão de nomes de arquivos: if x [[ -e ]] |
Date: | Sun, 12 Apr 2020 18:18:56 -0300 |
Buenas Romano,cara, acabei de escrever uma dica sobre isso, que pode ser vista, criticada e comentada aqui:O que acontece é que as opções do cmd test, ([...]ou [[...]]) são unárias, isto é só aceitam 1 único argumento. No cmd test antigo ([...]) e o shell fazia a expansão antes do cmd ser executado e isso acarretava erro. Para que não haja erro o novo test ([[...]]) expande os coringas, mas se isso resultar em mais de um, "desexpande ;)". Veja isso:$ ls a*
a.txt aa.txt arq1 arq2 arq3 arq4 arq5
$ [ -e a* ] && echo existe # Olha a msg de erro - a opção é unária
bash: [: número excessivo de argumentos
$ [ -e a.* ] && echo existe # Funciona pq casou só com a.txt
existe
$ [[ -e a* ]] && echo existe # Expandiu e desexpandiu
$ [[ -e a.* ]] && echo existe # Expandiu só para a.txtexistePara verificar se o arquivo existe, vc pode simplesmente fazer:$ ls arq* > /dev/null && {echo existem os seguintes:ls -l}Mas para saber se são arquivos do tipo normal, vc teria de fazer:$ for Arq in arq*{[[ -f "$Arq" ]] && echo $Arq existe e é um arquivo de dados # poderia ser [ -f "$Arq" ]}OBS: Até uns 50+ arquivos com mesmo prefixo ou sufixo, é mais rápido fazer:$do que o touch arq{"",1,2,3} que vc usou. touch é para manipular timestamp, não é para criar arquivos. Experimente fazer:time for ((i=1; i<200; i++)){> /tmp/arq}e depois:time for ((i=1; i<200; i++))
{
touch /tmp/arq
}Terminam hoje às 23:59 h ss matrículas para o meu Curso de Programação em Shell (de Nutella a Root).Apesar da crise, resolvemos lançá-lo pensando que as pessoas estão com tempo para se preparar mais estudando e sair dessa crise numa situação melhor.Mas como é tempo de crise, estamos dando, mas só nesse treinamento, 20% de desconto.
Veja os detalhes em https://educacao.dicas-l.com.br/shell-linux, mas não deixe de ver, pq o que propiciamos é bem diferente do que existe.Abraços,Julio______________________________________________________________________________________________Olá,
Estou com uma curiosidade a respeito de como o if e o [[ ]] respondem à expansão de nomes.
Vamos supor que eu tenha alguns arquivos que iniciam com os mesmos caracteres:
[root@host ~]# touch arq{"",1,2,3}
[root@host ~]# ls arq*
arq arq1 arq2 arq3
Os arquivos foram criados e o ls aceita o coringa *:
[root@host ~]# ls arq*
arq arq1 arq2 arq3
Eu gostaria de testar se arquivos arq* existem (qualquer um começando com 'arq', usando o coringa '*'):
Com if funciona usando o ls ...
[root@host ~]# if ls ./arq*> /dev/null; then echo "Existe"; else echo "Não existe"; fi
Existe
Mas se eu usar o [[ -e ]] (test moderno, testando se o arquivo existe) não funciona com o coringa...[root@host ~]# [[ -e ./arq ]] && echo Existe || echo Não existe
Existe
[root@host ~]# [[ -e ./arq1 ]] && echo Existe || echo Não existe
Existe
[root@host ~]# [[ -e ./arq* ]] && echo Existe || echo Não existe # <----
Não existe
É pura curiosidade. Posso usar o if, mas gostaria de saber se realmente o [[ ]] não permite expansão de nomes.
Abraços a todos!
Renato RomanoSão B. Campo/SP
------------------------------------------------------------------------------------------------
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: address@hidden
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: address@hidden
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/
NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
[Prev in Thread] | Current Thread | [Next in Thread] |