¿Cómo uso correctamente métodos personalizados que prueban un argumento, por ejemplo, si una cadena es una palabra o un número de versión, en un contexto condicional en if
declaraciones , while
o ?until
Especialmente las llaves (dobles) parecen tener un problema con métodos en un lado de una prueba como -gt
.
¿Puedo simplemente llamar a un método? En caso afirmativo, ¿cuáles son los requisitos de contexto para hacerlo? Entonces, dentro/fuera de los corchetes (dobles) y en las diferentes declaraciones if
, while
y until
¿cómo reaccionan al llamar a funciones sin sustitución de comandos?
Y si no uso la sustitución de comandos para llamar a diferentes métodos de prueba, ¿puedo aun así conectarlos mediante operadores booleanos?
Para su conexión, ¿hay casos de uso en los que tengo que usar paréntesis o paréntesis doble?
¿Cuándo necesito la expansión del comando? ¿Podría a veces necesitar expansión aritmética para llamar a funciones?
Respuesta1
Desea que su función devuelva éxito/fracaso verdadero/falso a través del estado de salida como todos los demás comandos, incluido el [
comando, ya sea usando el return
comando incorporado con 0 como argumento para verdadero/éxito y cualquier otra cosa para falso/fracaso o simplemente regresar con la salida del último comando ejecutado por la función:
isnewer() {
[ "$1" -nt "$2" ]
# here returns with the status of the [ command
}
isvowel() {
case $1 in
([aeiouAEIOU]) true;; # or return 0
(*) false;; # or return 1
esac
}
Ese regresa con el estado de salida del case
comando compuesto que a su vez regresa con el último comando ejecutado dentro (es decir, el del true
o el false
comando aquí).
Y luego en su declaración if
/ while
, llama a esas funciones, no al [
comando:
if isnewer /etc/passwd /etc/shadow; then
echo passwd newer than shadow
fi
if isvowel "$x" || isvowel "$y"; then...
En cuanto a sus referencias (no me quedan claras) a llaves dobles o paréntesis dobles, while [
es solo un comando normal (otro nombre para el test
comando), el shell Korn y algunos derivados, incluidos, bash
tienen:
- una
(( arithmetic expression ))
construcción, que evalúa la expresión aritmética (siguiendo una sintaxis similar a la del lenguaje C y variando entre shells) y devuelve verdadero/éxito (a través del estado de salida 0 como de costumbre) si el número resultante es cualquier cosa menos 0. Esa expresión aritmética La sintaxis tiene algunos operadores booleanos y de comparación similares a los de C ( ,,, ...<
) .>=
||
&&
- una
[[ conditional expression ]]
construcción que evalúa la expresión condicional (con su propia sintaxis, que también varía de un shell a otro y que recuerda la forma en que[
analiza su argumento. Esa construcción, al igual que el comando[
/,test
se puede utilizar para realizar una serie de pruebas como la-nt
anterior o comparar cadenas o incluso números.
Sin embargo, no existe un operador de doble llave en bash.