Sé que hay valores booleanos bash
, pero nunca los veo en ningún lado.
Quiero escribir un contenedor para alguna información a menudo buscada en mi máquina, por ejemplo, si esta unidad USB particular está insertada / montada.
¿Cuál sería la mejor práctica para lograr eso?
¿Una cuerda?
drive_xyz_available=true
¿Un número (0 para verdadero, ≠ 0 para falso)?
drive_xyz_available=0 # evaluates to true
¿Una función?
drive_xyz_available() { if available_magic; then return 0 else return 1 fi }
Principalmente me pregunto qué esperarían otras personas que quisieran usar el envoltorio. ¿Esperarían un valor booleano, un comando como variable o una función para llamar?
Desde el punto de vista de la seguridad, creo que la segunda opción es la más segura, pero me encantaría escuchar sus experiencias.
shell
shell-script
Minix
fuente
fuente
help true ; help false ; help exit
Respuestas:
Simplemente establezca una variable en cualquier cosa que no sea nula para que funcione lo anterior, aunque
[ -n "$var" ]
sería más corto, si no tan obvio.En general, cuando un script interpreta que una variable de entorno es verdadera o falsa, interpretará cualquier valor como verdadero (y, a veces, usará dicho valor para configurar alguna opción) o un valor nulo como falso.
Lo anterior devuelve el
!not
valor booleano de la len de su primer argumento: si el argumento contiene cualquier número de caracteres que no sea 0, devuelve 0, de lo contrario, si no tiene ningún carácter, devuelve 1. Esta es la misma prueba con la que puede realizar[ -n "$var" ]
, básicamente , pero simplemente lo envuelve en una pequeña función llamadabool()
.Por lo general, así es como funciona una variable de bandera . Por ejemplo:
Donde otras partes de un script solo necesitan buscar algún valor
$dir
para evaluar su utilidad. Esto también es útil cuando se trata de la sustitución de parámetros, ya que los parámetros se pueden expandir a los valores predeterminados para completar los valores vacíos o no establecidos, pero de lo contrario se expandirán a un valor preestablecido como ...... que imprimiría ...
Por supuesto, también es posible hacer lo contrario,
:+
pero eso solo puede darle un valor predeterminado predeterminado o nada en absoluto, mientras que el formulario anterior puede darle un valor o un valor predeterminado.Y así, con respecto a las tres opciones, cualquiera podría funcionar dependiendo de cómo elija implementarlo. El retorno de la función es de autocomprobación, pero, si ese retorno necesita guardarse por algún motivo, deberá colocarse en una variable. Depende del caso de uso: ¿es el valor booleano que desea evaluar una prueba una vez y listo? Si es así, realice la función, de lo contrario, cualquiera de los otros dos probablemente sea necesario.
fuente
true
ofalse
a una variable, entonces puedes hacerif $variable; then ...
$IFS
, y si el valor de la var puede contener información del usuario de cualquier tipo, también en buena suerte. Si no se desconoce el valor, entonces hay poca necesidad de probarlo. Puede hacerlo de manera más seguraif ${var:+":"} false; then
cuando trabaja con valores nulos / no nulos booleanos. Pero eso rara vez es más útil que[ -n "$var" ] &&
variable=false
y luego lo configuro en verdadero de acuerdo con cualquier condición (como lo haría al usar una variable en C), entonces no hay ningún problema, ¿Cuál es su obsesión con los valores IFS variables y los valores de variables aleatorias, etc. de todos modos? .En
bash
cada variable hay esencialmente una cadena (o una matriz o una función, pero hablemos de las variables regulares aquí).Las condiciones se analizan en función de los valores de retorno de los comandos de prueba: el valor de retorno no es una variable, es un estado de salida. Al evaluar
if [ ... ]
oif [[ ]]
oif grep something
ni nada de eso, el valor de retorno 0 (no cadena de 0, pero el código de salida 0 = éxito) que significa la verdadera y la falsa media de descanso (por lo que, exactamente lo contrario de lo que estamos acostumbrados en lenguajes de programación compilado, pero debido a que hay una forma de tener éxito y muchas formas de fracasar, y el resultado esperado de la ejecución suele ser exitoso, 0 se usa como el resultado predeterminado más común si nada sale mal). Esto es muy útil porque cualquier binario se puede usar como prueba; si falla, es falso, de lo contrario es cierto.true
y losfalse
programas (generalmente anulados por los componentes incorporados) son solo pequeños programas útiles que no hacen nada:true
logran no hacer nada y salen con 0, mientrasfalse
intentan no hacer nada y "fallan", saliendo con 1. Suena inútil pero es muy útil para las secuencias de comandos.En cuanto a cómo transmitir la veracidad, depende de usted. Es bastante común usar "y" o "sí" para la verdad y el uso
if [ x"$variable" = x"yes" ]
(se agrega la cadena ficticiax
porque si$variable
resulta ser de longitud cero, esto protege contra la creación de un comando falsoif [ = "yes" ]
que no analiza). También puede ser útil simplemente usar una cadena vacía para falso, y usar[ -z "$variable ]
para probar si es de longitud cero (o-n
para que no sea cero).De todos modos, es bastante raro que realmente necesite pasar valores booleanos
bash
: es mucho más común simplementeexit
en caso de falla o devolver un resultado útil (o cero si algo sale mal y probar una cadena vacía), y la mayoría de los casos pueden prueba de falla directamente desde el estado de salida.En su caso, desea una función que actúe como cualquier otro comando (por lo tanto, devuelve 0 en caso de éxito), por lo que su última opción parece ser la correcta.
Además, es posible que ni siquiera necesite una
return
declaración. Si la función es lo suficientemente simple, puede usar el hecho de que simplemente devuelve el estado del último comando ejecutado en la función. Entonces su función puede ser simplementesi está probando la existencia de un nodo de dispositivo (¿o grep
/proc/mounts
para verificar si está montado?).fuente
drive_xyz_available()
ser la más común?y = true
caso común ? En mi experiencia, la mayoría de los scripts de envoltura prueban cualquier valor no nulo para considerarlo verdadero, al menos en lo que respecta a las variables de entorno interpretadas. De lo contrario, ignoran por completo los coches cáscara.if
prueba no es necesaria si se cita la variable;if [ "$variable" = "yes" ]
funciona bien incluso si $ variable no está establecida.Básicamente, cualquier número que no sea 0 es verdadero y 0 es falso. Motivo para devolver valores como 0 para un final exitoso de un script o cualquier otro número para identificar diferentes tipos de errores.
$?
devolverá el código de salida del comando / ejecutable anterior, siendo 0 exitoso y cualquier otro número el error que ha sido devuelto.Entonces usaría ese método para verdadero / falso.
if (( ! $? ));then OK;else NOOK;fi
fuente
true; echo $?
yfalse; echo $?
.!
el resultado para que sea VERDADERO. El resultado de un comando es 0 cuando ha finalizado correctamente, lo que no significa que 0 sea verdadero. La palabratrue
puede ser 0, pero 0 nunca es verdadero como loif
demuestra la condición.0
estrue
porqueif(!x){True();}else{False();}
llamaráTrue()
cuándox==0
. Pero la verificación correcta no sería!x
, sino más bien!!x
.if
que simplemente diga el hecho de que aquí (en bash, o ksh, o tsh, o ...) como en C / C ++ a 0 es FALSO, cualquiera otro número es VERDADERO, como puede leer en el siguiente enlace, las implementaciones iniciales de C no proporcionaron ningún tipo booleano, definiéndose como ints donde 0 era FALSO y 1 VERDADERO en.wikipedia.org/wiki/Boolean_data_type .