Me gustaría que mi script Bash imprima un mensaje de error si no se cumple el recuento de argumentos requerido.
Intenté el siguiente código:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Por alguna razón desconocida, tengo el siguiente error:
test: line 4: [2: command not found
¿Qué estoy haciendo mal?
test
. Ese es el nombre de un comando estándar de Unix, no querrás seguirlo.test
está bien, siempre y cuando no esté en la RUTA?Respuestas:
Al igual que cualquier otro comando simple,
[ ... ]
otest
requiere espacios entre sus argumentos.O
Sugerencias
Cuando
[[ ]]
esté en Bash, prefiera usar en su lugar, ya que no divide las palabras ni expande el nombre de ruta a sus variables, por lo que es posible que no sea necesario citar, a menos que sea parte de una expresión.También tiene algunas otras características como agrupación de condiciones sin comillas, coincidencia de patrones (coincidencia de patrones extendida con
extglob
) y coincidencia de expresiones regulares.El siguiente ejemplo verifica si los argumentos son válidos. Permite un solo argumento o dos.
Para expresiones aritméticas puras, utilizando
(( ))
a algunos todavía puede ser mejor, pero todavía son posibles en[[ ]]
con sus operadores aritméticos gustaría-eq
,-ne
,-lt
,-le
,-gt
, o-ge
mediante la colocación de la expresión como un único argumento de cadena:Eso debería ser útil si necesita combinarlo con otras características
[[ ]]
también.Salir del guión
También es lógico hacer que la secuencia de comandos salga cuando se le pasan parámetros no válidos. Esto ya ha sido sugerido en los comentarios de ekangas, pero alguien editó esta respuesta para tenerla
-1
como el valor devuelto, por lo que bien podría hacerlo bien.-1
aunque Bash lo acepta como argumento,exit
no está explícitamente documentado y no es correcto utilizarlo como una sugerencia común.64
también es el valor más formal ya que se definesysexits.h
con#define EX_USAGE 64 /* command line usage error */
. La mayoría de las herramientasls
también devuelven2
argumentos no válidos. También solía volver2
en mis scripts, pero últimamente ya no me importaba, y simplemente lo usaba1
en todos los errores. Pero ubicémonos2
aquí, ya que es más común y probablemente no específico del sistema operativo.Referencias
fuente
[
es solo otro comando, es decir, intentewhich [
.[
es un incorporado, mientras que[[
es una palabra clave. En algunas conchas más viejas,[
ni siquiera está incorporado. Los comandos como,[
naturalmente, coexisten como un comando externo en la mayoría de los sistemas, pero el shell prioriza los comandos internos a menos que omita concommand
oexec
. Consulte la documentación del shell sobre cómo evalúan. Tome nota de su diferencia y de cómo pueden comportarse de manera diferente en cada caparazón.Puede ser una buena idea usar expresiones aritméticas si se trata de números.
fuente
[ ... ]
, cuando esto funciona bien y no se necesitan operaciones sofisticadas?$(( ))
no son sofisticadas y deben implementarse en todos los shells POSIX. Sin embargo, la(( ))
sintaxis (sin$
) no forma parte de ella. Si por alguna razón está limitado, entonces seguramente puede usarlo[ ]
en su lugar, pero tenga en cuenta que no debería usarlo[[ ]]
también. Espero que comprenda las trampas[ ]
y las razones por las que existen estas características. Pero esta era una pregunta de Bash, por lo que estamos dando respuestas de Bash ( "Como regla general, [[se usa para cadenas y archivos. Si desea comparar números, use una expresión aritmética" ).En []:! =, =, == ... son :! operadores de comparación de cadenas y -eq, -gt ... son aritméticos binarios.
Yo usaría:
O:
fuente
==
En realidad, es una característica no documentada, que pasa a trabajar con GNUtest
. También sucede que el trabajo con FreeBSDtest
, pero puede que no funcione en footest
. La única comparación estándar es=
(solo para su información).dash
:dash -c '[ 1 == 1 ]'
. POSIX solo especifica=
, y no==
.Si solo está interesado en rescatar si falta un argumento en particular, la sustitución de parámetros es excelente:
fuente
Un revestimiento simple que funciona puede hacerse usando:
Esto se descompone en:
Piensa tener en cuenta:
fuente
exit 1
que solo se aplicaría al contexto de la subshell, por lo que también es así( usage; false )
. No soy un fanático de esa forma de simplificación cuando se trata del análisis de opciones, pero puedes usarlo{ usage && exit 1; }
en su lugar. O probablemente solo{ usage; exit 1; }
.{...}
es una sintaxis común y está disponible para la mayoría de los shells, si no todossh
, incluso aquellos que no cumplen con los estándares POSIX.Echa un vistazo a esta hoja de trucos de bash, puede ayudar mucho.
Para verificar la longitud de los argumentos pasados, utiliza
"$#"
Para usar la matriz de argumentos pasados, usa
"$@"
Un ejemplo de verificar la longitud e iterar sería:
Esto articulado me ayudó, pero me faltaban algunas cosas para mí y mi situación. Esperemos que esto ayude a alguien.
fuente
En caso de que quiera estar seguro, le recomiendo usar getopts.
Aquí hay un pequeño ejemplo:
ver más detalles aquí, por ejemplo http://wiki.bash-hackers.org/howto/getopts_tutorial
fuente
Aquí, un simple revestimiento para verificar si solo se proporciona un parámetro; de lo contrario, salga del script:
fuente
Debe agregar espacios entre la condición de prueba:
Espero que esto ayude.
fuente