shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Expansão de nomes de arquivos: if x [[ -e ]]


From: Itamar Santos de Souza
Subject: Re: [shell-script-pt] Expansão de nomes de arquivos: if x [[ -e ]]
Date: Sun, 12 Apr 2020 21:00:12 +0000 (UTC)

Caro Renato os comandos ls e "test moderno" tem objetivos diferentes a priori.

Mas vc está cometendo um engano nessa comparação, o if como foi usado não considera a saída do ls, mas o código de retorno do comando, por isso é muito comum usar o if junto com test.

A sintaxe que usou é verificar no test é verificar a existência de uma arquivo específico, e o ls é listar arquivos que atendem o critério fornecido ou todos os disponíveis.

Tanto que se vc fizer:

$ ls arq* >/dev/null 2>&1 && echo Existe || echo Não existe

Tem o mesmo efeito que:
$ if ls arq* >/dev/null 2>&1; then echo Existe; else echo Não Existe; fi
e
$ ls arq* >/dev/null 2>&1
$ if test $? -eq 0; then echo Existe; else echo Não Existe; fi

Então o comando test trabalha com elementos finitos nas suas comparações podendo ser unitários ou duplos, enquanto o comando ls é mais amplo, e não tem i mesmo escopo do if que direciona o fluxo em virtude do código de retorno do comando usado.

man ls
man test
man bash

podem dar mais detalhes sobre essas diferenças

[]'s
Itamar

Em domingo, 12 de abril de 2020 17:34:15 BRT, address@hidden <address@hidden> escreveu:


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 Romano
Sã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.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]