Quiero escribir una función bash que verifique si un archivo tiene ciertas propiedades y devuelve verdadero o falso. Entonces puedo usarlo en mis scripts en el "si". ¿Pero qué debo devolver?
function myfun(){ ... return 0; else return 1; fi;}
entonces lo uso así:
if myfun filename.txt; then ...
Por supuesto, esto no funciona. ¿Cómo se puede lograr esto?
function
palabra clave,myfun() {...}
bastaif
es el estado de salida cero demyfun
: simyfun
sale con0
,then ...
se ejecuta; si es algo máselse ...
se ejecuta.function
palabra clave es un bashismo y provocará errores de sintaxis en algunos otros shells. Básicamente, es innecesario o está prohibido, entonces, ¿por qué usarlo? Ni siquiera es útil como un objetivo grep, ya que podría no estar allí (grep para su()
lugar).Respuestas:
Use 0 para verdadero y 1 para falso.
Muestra:
Editar
Del comentario de @amichair, estos también son posibles
fuente
[ -d "$1" ]
.¿Por qué debería importarle lo que digo a pesar de que hay una respuesta de más de 250 votos?
No es eso
0 = true
y1 = false
. Es: cero significa que no hay falla (éxito) y no cero significa falla (de tipo N) .Si bien la respuesta seleccionada es técnicamente "verdadera" , no ponga
return 1
** en su código como falso . Tendrá varios efectos secundarios desafortunados.Aprende un poco de fiesta
El manual de bash dice (énfasis mío)
Por lo tanto, no tenemos que usar NUNCA 0 y 1 para indicar Verdadero y Falso. El hecho de que lo hagan es esencialmente un conocimiento trivial útil solo para depurar código, preguntas de entrevistas y hacer volar las mentes de los novatos.
El manual de bash también dice
El manual de bash también dice
Whoa, espera. ¿Tubería? Pasemos al manual de bash una vez más.
Si. Dijeron que 1 comando es una tubería. Por lo tanto, las 3 citas dicen lo mismo.
$?
te dice lo que pasó la última vez.Mi respuesta
Entonces, mientras @Kambus demostró que con una función tan simple, no
return
se necesita nada. Creo que era poco realista en comparación con las necesidades de la mayoría de las personas que leerán esto.Por qué
return
?Si una función va a devolver el estado de salida de su último comando, ¿por qué usar
return
? Porque hace que una función deje de ejecutarse.Detener la ejecución en múltiples condiciones
Lo que tenemos aquí es ...
La línea
04
es un retorno explícito [-ish] verdadero porque el RHS de&&
solo se ejecuta si el LHS era verdaderoLa línea
09
devuelve verdadero o falso que coincide con el estado de la línea08
La línea
13
devuelve falso debido a la línea12
(Sí, esto se puede reducir, pero todo el ejemplo está ideado).
Otro patrón común
Observe cómo establecer una
status
variable desmitifica el significado de$?
. (Por supuesto, usted sabe lo que$?
significa, pero alguien con menos conocimiento que usted tendrá que buscarlo en Google algún día. A menos que su código esté haciendo operaciones de alta frecuencia, muestre algo de amor , establezca la variable). Pero la verdadera conclusión es que "si no existe el estado "o viceversa" si el estado de salida "se puede leer en voz alta y explicar su significado. Sin embargo, ese último puede ser un poco ambicioso porque ver la palabraexit
podría hacerte pensar que está saliendo del script, cuando en realidad está saliendo del$(...)
subshell.** Si insiste absolutamente en usar
return 1
para falso, le sugiero que al menos lo usereturn 255
en su lugar. Esto hará que tu futuro yo o cualquier otro desarrollador que deba mantener tu código se pregunte "¿por qué es 255?" Entonces al menos estarán prestando atención y tendrán una mejor oportunidad de evitar un error.fuente
if
éxito hacer esto,else
hacer aquello". ¿Éxito en qué? Podría estar buscando verdadero / falso, podría estar buscando una cadena, un entero, un archivo, un directorio, permisos de escritura, glob, regex, grep o cualquier otro comando que esté sujeto a fallas .true
yfalse
comandos. Es decir, la palabra clavetrue
literalmente se evalúa como un código de estado 0. Además, las declaraciones if-then por naturaleza operan en booleanos, no en códigos de éxito. Si ocurre un error durante una operación booleana, no debería devolver verdadero o falso, sino simplemente interrumpir la ejecución. De lo contrario, obtienes falsos positivos (juego de palabras).return 1
debería evitarse el uso. Suponiendo que tengo unavalidate
función, me parece razonablereturn 1
si la validación falla. Después de todo, esa es una razón para detener la ejecución de un script si no se maneja correctamente (por ejemplo, cuando se usaset -e
).return 1
es válido. Mi preocupación son todos los comentarios aquí que dicen "0 = verdadero 1 = falso es [insertar palabra negativa]". Es probable que esas personas lean su código algún día. Entonces, para ellos, verreturn 255
(o 42 o incluso 2) debería ayudarlos a pensarlo más y no confundirlo como "verdadero".set -e
aún lo atrapará.fuente
Tenga cuidado al verificar el directorio solo con la opción -d!
Si la variable $ 1 está vacía, el cheque seguirá siendo exitoso. Para estar seguro, verifique también que la variable no esté vacía.
fuente
$1
("$1"
), entonces no necesita verificar si hay una variable vacía. El[[ -d "$1" ]]
fallarían porque este""
no es un directorio.Encontré un punto (¿aún no mencionado explícitamente?) Que me estaba tropezando. Es decir, no cómo devolver el valor booleano, sino cómo evaluarlo correctamente.
Estaba tratando de decir
if [ myfunc ]; then ...
, pero eso simplemente está mal. ¡No debes usar los soportes!if myfunc; then ...
es la forma de hacerlo¡Como en @Bruno y otros reiteraron,
true
yfalse
son comandos , no valores! Eso es muy importante para comprender los booleanos en los scripts de shell.En esta publicación, expliqué y demostré usando variables booleanas : https://stackoverflow.com/a/55174008/3220983 . Sugiero comprobar esto, porque está muy relacionado.
Aquí, proporcionaré algunos ejemplos de devolución y evaluación de booleanos de funciones:
Esta:
No produce salida de eco. (es decir,
false
devuelve falso)Produce:
(es decir,
true
devuelve verdadero)Y
Produce:
Porque 0 (es decir, verdadero) se devolvió implícitamente .
Ahora, esto es lo que me estaba jodiendo ...
Produce:
Y
TAMBIÉN produce:
¡Usar los corchetes aquí produjo un falso positivo ! (Infiero que el resultado del comando "externo" es 0.)
La principal conclusión de mi publicación es: ¡no use corchetes para evaluar una función booleana (o variable) como lo haría para una verificación de igualdad típica, por ejemplo
if [ x -eq 1 ]; then...
!fuente
Use los comandos
true
ofalse
inmediatamente antes de sureturn
, luegoreturn
sin parámetros. Elreturn
utilizará automáticamente el valor de su último comando.Proporcionar argumentos
return
es inconsistente, escriba un tipo específico y es propenso a errores si no está usando 1 o 0. Y como han dicho los comentarios anteriores, usar 1 o 0 aquí no es la forma correcta de abordar esta función.Salida:
fuente
Podría funcionar si reescribe esto
function myfun(){ ... return 0; else return 1; fi;}
como estofunction myfun(){ ... return; else false; fi;}
. Es decir, sifalse
es la última instrucción en la función, obtiene un resultado falso para la función completa, pero dereturn
todos modos interrumpe la función con un resultado verdadero. Creo que es cierto para mi intérprete bash al menos.fuente
Encontré que la forma más corta para probar la salida de la función es simplemente
fuente
Por razones de legibilidad del código, creo que devolver verdadero / falso debería:
return
seguida de otra palabra clave (true
ofalse
)Mi solución es
return $(true)
oreturn $(false)
como se muestra:fuente
Siguiendo a @Bruno Bronosky y @mrteatime, le sugiero que escriba su retorno booleano "al revés". Esto es lo que quiero decir:
Eso elimina el requisito de dos líneas feas para cada declaración de devolución.
fuente