Solo deberías usarlo alguna vez #! /bin/sh
.
No debe usar extensiones bash (o zsh, o fish, o ...) en un script de shell, nunca.
Solo debe escribir scripts de shell que funcionen con cualquier implementación del lenguaje de shell (incluidos todos los programas de "utilidad" que acompañan al propio shell). En estos días, probablemente pueda tomar POSIX.1-2001 ( no -2008) como autoridad para lo que el shell y las utilidades son capaces de hacer, pero tenga en cuenta que algún día puede ser llamado para portar su script a un sistema heredado (por ejemplo, Solaris o AIX) cuyo shell y utilidades fueron congelados alrededor de 1992
¿Qué, en serio?
Sí, en serio.
Aquí está la cosa: Shell es un lenguaje de programación terrible . Lo único que tiene es que /bin/sh
es el único intérprete de guiones que se garantiza que todas las instalaciones de Unix tengan.
Aquí está la otra cosa: /usr/bin/perl
es más probable que alguna iteración del intérprete principal de Perl 5 ( ) esté disponible en una instalación de Unix seleccionada al azar de lo que (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
está. Otros buenos lenguajes de scripting (Python, Ruby, node.js, etc. - Incluso incluiré PHP y Tcl en esa categoría al comparar con shell) también están disponibles como bash y otros shells extendidos.
Por lo tanto, si tiene la opción de escribir un script bash, tiene la opción de usar un lenguaje de programación que no sea terrible.
Ahora, simples scripts de shell, del tipo que solo ejecuta algunos programas en una secuencia desde un trabajo cron o algo así, no hay nada de malo en dejarlos como scripts de shell. Pero los scripts de shell simples no necesitan matrices o funciones, ni [[
siquiera. Y solo debe escribir scripts de shell complicados cuando no tiene otra opción. Las secuencias de comandos de Autoconf, por ejemplo, siguen siendo correctamente secuencias de comandos de shell. Pero esos scripts tienen que ejecutarse en cada encarnación /bin/sh
que sea relevante para el programa que se está configurando. y eso significa que no pueden usar ninguna extensión. Probablemente no tenga que preocuparse por los viejos Unix patentados en estos días, pero probablemente debería preocuparse por los BSD de código abierto actuales, algunos de los cuales no se instalanbash
de forma predeterminada, y entornos integrados que le brindan solo un shell y un mínimo busybox
.
En conclusión, en el momento en que te encuentras queriendo una característica que no está disponible en el lenguaje shell portátil, eso es una señal de que el script se ha vuelto demasiado complicado para seguir siendo un script shell. Reescríbalo en un mejor idioma.
bash
funciones y sintaxis en lugar desh
funciones y sintaxis.