Siempre trato de mantener POSIX en sh
lugar de usar extensiones Bash, ya que uno de los puntos principales de la secuencia de comandos es la portabilidad (además de conectar programas, no reemplazarlos).
En sh
, hay una manera fácil de verificar si hay una condición "es-prefijo".
case $HOST in node*)
# Your code here
esac
Dada la antigüedad, sh arcano y crujiente (y Bash no es la cura: es más complicado, menos consistente y menos portátil), me gustaría señalar un aspecto funcional muy agradable: mientras que algunos elementos de sintaxis como case
están incorporados , las construcciones resultantes no son diferentes a cualquier otro trabajo. Se pueden componer de la misma manera:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
O incluso más corto
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
O incluso más corto (solo para presentarlo !
como un elemento del lenguaje, pero este es un mal estilo ahora)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
Si te gusta ser explícito, crea tu propio elemento de lenguaje:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
¿No es esto realmente bastante agradable?
if beginswith node "$HOST"; then
# Your code here
fi
Y dado sh
que básicamente son solo trabajos y listas de cadenas (y procesos internos, de los cuales se componen los trabajos), ahora podemos incluso hacer una programación funcional ligera:
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
Esto es elegante No es que yo recomendaría usar sh
algo serio: se rompe demasiado rápido según los requisitos del mundo real (no hay lambdas, por lo que debemos usar cadenas. Pero anidar llamadas de función con cadenas no es posible, las tuberías no son posibles, etc.)