Cómo hacer una operación OR lógica en Shell Scripting

Estoy tratando de hacer una verificación de condición simple, pero parece que no funciona.

Si $# es igual a 0 o es mayor que 1 entonces diga hola.

He intentado la siguiente syntax sin éxito:

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

Esto debería funcionar:

 #!/bin/bash if [ "$#" -eq 0 ] || [ "$#" -gt 1 ] ; then echo "hello" fi 

No estoy seguro de si esto es diferente en otros caparazones, pero si desea usar <,>, debe ponerlos dentro del paréntesis doble como sigue:

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

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 

No creo que sh admita “==”. Use “=” para comparar cadenas y -eq para comparar las partes.

 man test 

para más detalles.

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

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

Porque si lo haces:

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

La parte izquierda de la OR altera los $? variable, ¿entonces la parte derecha de la OR no tiene el $ original ? valor.

A veces necesitas usar corchetes dobles; de lo contrario, obtienes un error como demasiados argumentos

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

Has intentado algo como ésto:

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

De Bash Manual de referencia → 3.4.2 Parámetros especiales

#
($ #) Se expande a la cantidad de parámetros posicionales en decimal.

Por lo tanto, $# siempre será 0 o un entero más grande.

Entonces, si quiere hacer algo cuando $# es 0 o más que 1, solo tiene que verificar si $# es o no es 1 :

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

Esto usa la syntax:

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

Si un script bash

 If [[ $input -gt number || $input -lt number ]] then echo ......... else echo ......... fi exit