Bash: ¿Cómo utilizar funciones personalizadas (que devuelven verdadero o falso) en construcciones condicionales?

Bash: ¿Cómo utilizar funciones personalizadas (que devuelven verdadero o falso) en construcciones condicionales?

¿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 ifdeclaraciones , whileo ?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, whiley 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 returncomando 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 casecomando compuesto que a su vez regresa con el último comando ejecutado dentro (es decir, el del trueo el falsecomando 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 testcomando), el shell Korn y algunos derivados, incluidos, bashtienen:

  • 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 [/, testse puede utilizar para realizar una serie de pruebas como la -ntanterior o comparar cadenas o incluso números.

Sin embargo, no existe un operador de doble llave en bash.

información relacionada