¿Cuál es la sintaxis más portátil para declaraciones "if"?

¿Cuál es la sintaxis más portátil para declaraciones "if"?

(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 ifse trata. ifhace algo si some-command(que puede ser una función, un shell incorporado o un ejecutable 1 ) regresa 0para 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 0si 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 ifconstructose 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.

información relacionada