Tengo este código
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Cuando ejecuto bash getoptDemos.sh
(sin la opción) se imprime en hi
lugar de llamar a la función usage
. Llama al uso cuando se dan opciones distintas de w, h y l. Entonces no puede funcionar cuando no se especifican opciones.
He intentado usar ?
, \?
, :
en lugar de *
, pero no puedo lograr lo que quería. Me refiero a todo el docs
en getopt
lo dice de usar ?
.
¿Qué estoy haciendo mal?
/bin/bash
Respuestas:
Cuando ejecuta este script sin ninguna opción, getopt devolverá falso, por lo que no entrará en el bucle en absoluto. Simplemente se desplegará a la impresión: ¿es esto ksh / zsh?
Si debe tener una opción, lo mejor es probar $ name después del ciclo.
Pero asegúrese de que esté
$name
vacío antes de llamargetopts
(ya que podría haber un$name
en el entorno que el shell recibió al inicio) con(antes del
getopts
bucle)fuente
no argument
condición usando bash.getopts
que no tenga esa disposición. Lo que es peor que eso es que no puede votarte.getopts
procesa las opciones a su vez. Ese es su trabajo. Si el usuario no pasa ninguna opción, la primera invocación degetopts
sale del ciclo while.Si ninguna de las opciones toma un argumento, el valor de
OPTIND
indica cuántas opciones se pasaron. En general,OPTIND
es el número de argumentos que son opciones o argumentos a opciones, en oposición a los argumentos que no son opciones (operandos).En cualquier caso, no está tratando de determinar si no había opciones, sino si no
name
se pasó ninguna de las opciones de configuración. Por lo tanto, compruebe siname
está desarmado (y tenga cuidado de desarmarlo primero) .fuente
bash sample.sh -abc file.txt
da -1 non-option arguments
. ¿Cómo puedo saber cuántas opciones se dieron? (aquí 3)Si su script debe recibir argumentos de opción, en cualquier caso, coloque este bloque al principio (antes de los getops).
Block verifica que la cadena de parámetro no comience con el
-
símbolo, lo que indica que el primer parámetro no es un argumento de opción.fuente
Lo comprobaría con una variable. Si getopts nunca pasa el ciclo en caso de que no haya argumento, puede usarlo, por ejemplo, de esta manera:
fuente
Justo antes de su
getopts
bloqueo, verifique si$1
(el primer argumento / opción que pasó en la línea de comando) es igual a una cadena vacía. Si es así, imprima el mensaje de uso y salga (o ejecute alguna función "sin opciones" si es un anarquista), de lo contrario,getopts
analice las opciones como de costumbre.La razón por la que esta característica no está incluida en getopts, es porque ya puedes lograrlo en bash con un "if-else". Ejemplo:
¿Tener sentido?
fuente