
(NOTA: Hayuna pregunta muy similar, preguntó ayer por extraño que parezca, pero no cubre las sintaxis principales que me preocupan. Si actualizara la otra pregunta para incluirlas, las respuestas podrían dejar de ser válidas, por lo que me centraré aquí en lo que se omitió en la otra pregunta. Cualquiera que quiera tener una visión completa debería mirar ambas preguntas y sus respuestas aceptadas).
Normalmente escribo mis declaraciones if de la siguiente manera:
if [[ -z "$SOMETHING" ]]; then
# blah blah blah
fi
que funciona bien para mí en Bash y Z Shell, pero recientemente encontréuna sintaxis que elimina los corchetes por completo:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
¿La versión sin soportes es portátil? ¿Cómo se compara con las opciones presentadas?aquí?
¿Mi versión estándar solo es compatible principalmente con Bash y Z Shell (como la [[ -w /home/durrantm ]] && echo "writable"
versión mencionada en esa otra pregunta)?
Respuesta1
Sí, su versión estándar no es el estándar POSIX, como señala la pregunta que vinculó. Sin embargo, lo siguiente es:
if some-command args; then ...
Yo diría que esta es la única forma portátil de if
, ya que de eso if
se trata. if
hace algo si some-command
(que puede ser una función, un shell incorporado o un ejecutable 1 ) regresa 0
para los argumentos y la entrada con los que se ejecuta.
Cuando ejecuta if [ ]
o if [[ ]]
, [ ]
y [[ ]]
son programas o componentes integrados del shell que regresan 0
si la condición es verdadera. Si convierte [
a test
, verá que siempre ejecuta el formulario sin los corchetes:
if [ ... ]
# same as
if /bin/test ...
1 Para ser más precisos, veamos cómo funciona el if
constructose define:
Elsicomando ejecutará unlista de compuestosy utilizar su estado de salida para determinar si se debe ejecutar otrolista de compuestos.
El formato para elsiconstructo es el siguiente:
if compound-list then compound-list [elif compound-list then compound-list] ... [else compound-list] fi
Tenga en cuenta que unlista compuestano es lo mismo que uncomando compuesto.