2010-11-06 5 views
390

Estoy tratando de hacer una verificación de condición simple, pero parece que no funciona.Cómo hacer una operación OR lógica en Shell Scripting

Si $# es igual a 0 o es mayor que 1, y, a continuación, decir hello.

He intentado el siguiente sintaxis sin éxito:

if [ "$#" == 0 -o "$#" > 1 ] ; then 
echo "hello" 
fi 

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then 
echo "hello" 
fi 
+0

Ambos trabajan para mí. ¿Especificó un shell en la línea * shebang *? –

+1

@Jason Olvidé la línea shebang, pero la probé con ella ahora y no funcionó. – Strawberry

+15

'>' es la redirección de salida en sh/bash. Ahora probablemente tengas un archivo llamado '1'. – mark4o

Respuesta

683

Esto debería funcionar:

if [ "$#" == 0 ] || [ "$#" -gt 1 ] ; then 
echo "hello" 
fi 

No estoy seguro si esto es diferente en otros proyectiles, pero si desea utilizar <,>, tiene que ponerlos dentro de doble paréntesis, así:

if (("$#" > 1)) 
... 
+2

No estoy seguro de si es diferente en otro intérprete de comandos, pero en bash, si desea usar> o <, debe ponerlos en paréntesis doble como sigue: (("$ a" <"$ b ")) –

+1

@Doug: No es que Unix no los use, es ese bash y todos los demás shells que conozco los utilizan para la redirección de entrada/salida. – Cascabel

+14

Utilice '-eq' no' == '. prueba de hombre –

6

has necesitado algo como esto:

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then 
echo "$#" 
fi 
+0

Sí, tengo. Es 'echo's hola incluso cuando tengo un solo argumento. – Strawberry

+0

con bash esto funciona para mí. –

43

Este código funciona para mí:

#!/bin/sh 

argc=$# 
echo $argc 
if [ $argc -eq 0 -o $argc -eq 1 ]; then 
    echo "foo" 
else 
    echo "bar" 
fi 

Pongo 't think sh admite "==". Use "=" para comparar cadenas y -eq para comparar las partes.

man test 

para obtener más información.

+0

¿Cuál es la opción para mayor que? ¿Dónde está la documentación oficial para tihs? – Strawberry

+3

Debe ser '-gt' para mayor que. O simplemente reemplázalo todo con '[$ # -ne 1]'. – mark4o

+0

Mayor que es -gt, ver mi respuesta. La documentación oficial está en prueba de hombre como señaló jbremnant. –

25

Si está utilizando el estado del código de salida bash $? tan variables, es mejor hacer esto:

if [ $? -eq 4 -o $? -eq 8 ] ; then 
    echo "..." 
fi 

Porque si es así:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then 

La parte izquierda de la O altera la $? variable, por lo que parte derecha de O no tiene el original $? valor.

+1

$ # devuelve la cantidad de argumentos pasados ​​al script. Útil para verificar el uso correcto. No parece que el asker esté usando códigos de salida. – Centimane

1

De Bash Reference Manual → 3.4.2 Special Parameters

#
($ #) Se expande al número de parámetros posicionales en decimal.

Por lo tanto, $# siempre será 0 o un número entero mayor.

Así que si quieres hacer algo cada vez $# es 0 o mayor que 1, sólo hay que comprobar si $# es o no es 1:

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1" 

Esto utiliza la sintaxis:

[ condition ] && {things if true} || {things if false} 
+0

en bash puedes hacer algo como: '[[-n $ A]] && echo 1 || echo 2' –

+0

@ premek.v gracias por el comentario. Mi respuesta fue muy mal explicada, solo la edité con la esperanza de que arroje más luz sobre el tema. – fedorqui

12

A veces necesita usar corchetes dobles; de lo contrario, obtendrá un error como demasiados argumentos

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]] 
    then 
fi 
Cuestiones relacionadas