Pregunta

Una gran cantidad de código SH se ve así:

$cmd
if [ $? = 0 ]; then $cmd2; fi

En lugar de:

if $cmd; then $cmd2; fi

Me suelen asumido que la gente utiliza el primero simplemente porque no son conscientes de que la sintaxis de este último es válido, pero me pregunto si hay alguna otra razón (aunque la única posibilidad de que viene a la mente es la portabilidad). ¿Hay alguna razón para preferir $ hagan referencia explícita {?}?.

¿Fue útil?

Solución

Hay que hacer referencia a $? si realmente desea utilizar el código de error para algo (la explotación forestal, el manejo de errores esperados, etc.). Para el escenario particular que lo mencionas, la segunda construcción if es a la vez más claro y más corto, y no veo ninguna razón para no usarlo.

Otros consejos

En mi opinión, ya que mucha gente no se da cuenta de que puede probar el estado del comando más o menos como lo hace. Del mismo modo, la gente también no se dan cuenta de que puede escribir:

if cmd1
   cmd2
   cmd3
then
    ...do this after executing cmd1, cmd2 and cmd3, but ...
    ...only if cmd3 exits with with status 0!
fi

También puede simplificar el código (a costa de concisión) a:

cmd1 && cmd2

(Veo @shin observó esto en un comentario, que he votado hasta-).

también veo un montón de código shell 'Bourne' que utiliza:

if ( ... )
then ...
fi

A veces es apropiado - pero más a menudo es la materia que un programador C shell no escribió darse cuenta de que la notación significa 'ejecutar un sub-shell' en Bourne shell y derivados - tales como Korn shell, las conchas compatibles con POSIX, y Bash.

Debido a que está probando el indicador de estado de la orden, en lugar de probar la salida del comando.

Si un comando imprime por la salida estándar, pero establece un indicador, que obtendrá obtener resultados diferentes con los dos ejemplos que has dado.

mi error, después de probarlo. Pensé que recordaba corriendo en un problema hace años en Solaris, pero no puedo recrear bajo las máquinas actualmente tengo acceso a excepto para las pruebas (en ksh?):

si [$cmd]

Si mucha gente no sabe acerca de esta última forma más elegante. He mencionado previamente esta en: http://www.pixelbeat.org/programming/shell_script_mistakes.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top