Eu sempre tento manter o POSIX em sh
vez de usar extensões Bash, pois um dos principais pontos de script é a portabilidade (além de conectar programas, não substituí-los).
Em sh
, existe uma maneira fácil de verificar uma condição "é prefixo".
case $HOST in node*)
# Your code here
esac
Dada a idade, o arcano e o crocante sh (e o Bash não é a cura: é mais complicado, menos consistente e menos portátil), eu gostaria de destacar um aspecto funcional muito agradável: embora alguns elementos de sintaxe case
sejam incorporados , as construções resultantes não são diferentes de qualquer outro trabalho. Eles podem ser compostos da mesma maneira:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
Ou ainda mais curto
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
Ou ainda mais curto (apenas para apresentar !
como um elemento de linguagem - mas esse é um estilo ruim agora)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Se você gosta de ser explícito, crie seu próprio elemento de linguagem:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
Isso não é realmente muito bom?
if beginswith node "$HOST"; then
# Your code here
fi
E como sh
são basicamente apenas trabalhos e listas de strings (e processos internamente, dos quais os trabalhos são compostos), agora podemos fazer alguma programação funcional leve:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
Isso é elegante. Não que eu advogasse o uso sh
de algo sério - ele quebra muito rapidamente os requisitos do mundo real (sem lambdas, portanto, devemos usar strings. Mas aninhar chamadas de função com strings não é possível, tubos não são possíveis, etc.)