
Um script zsh executado: script.zsh nameabc01
, script.zsh
preciso verificar se nameabc01
está nesse padrão na*abc*
ou não para continuar fazendo algo ou decidir sair do script.
Como podemos conseguir isso?
e para estender esta questão, como podemos conseguir isso verificando uma lista de padrões em um arquivo (separados por nova linha)?
Responder1
Teste se existem argumentos e se o primeiro argumento corresponde a algum padrão glob:
#!/usr/bin/env zsh
if (( # == 0 )); then
print >&2 "Usage: $0 na*abc* ..."
exit 1
fi
if [[ $1 != na*abc* ]]; then
print >&2 "not ok"
exit 1
fi
(Sim, eu recuo scripts de shell em três espaços e não, nunca coloquei *.zsh
extensões *.sh
neles) que podem ser testados:
% ./argchecker
Usage: ./argchecker na*abc* ...
% ./argchecker wombat
not ok
% ./argchecker na1abc1
% ./argchecker na1111111111abc1111111111
%
Se você quiser permitir, na1abc1
mas proibir, na1111111111abc1111111111
você precisará usar ?
em vez de *
ou mudar para uma expressão regular correspondente =~
e uma expressão regular adequada.
Ler uma lista de padrões de um arquivo também é possível, mas requer um pouco mais de código para a lógica necessária.
#!/usr/bin/env zsh
if (( # == 0 )); then
print >&2 "Usage: $0 todofixme ..."
exit 1
fi
globs=(${(f)"$(< patternfile)"})
ret=1
for g in $globs; do
if [[ $1 == $~g ]]; then
ret=0
break
fi
done
if (( ret == 1 )); then
print >&2 "not ok"
exit 1
fi
E o patternfile
e alguns testes.
% cat patternfile
cat*
*bat
% ./pargchecker fish
not ok
% ./pargchecker catfish
% ./pargchecker wombat
%
Os documentos em zshexpn(1)
e zshparam(1)
provavelmente funcionam como uma espiada ou no código existente no $fpath[-1]
diretório.