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 hilugar 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 docsen getoptlo dice de usar ?.
¿Qué estoy haciendo mal?

/bin/bashRespuestas:
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é
$namevacío antes de llamargetopts(ya que podría haber un$nameen el entorno que el shell recibió al inicio) con(antes del
getoptsbucle)fuente
no argumentcondición usando bash.getoptsque no tenga esa disposición. Lo que es peor que eso es que no puede votarte.getoptsprocesa las opciones a su vez. Ese es su trabajo. Si el usuario no pasa ninguna opción, la primera invocación degetoptssale del ciclo while.Si ninguna de las opciones toma un argumento, el valor de
OPTINDindica cuántas opciones se pasaron. En general,OPTINDes 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
namese pasó ninguna de las opciones de configuración. Por lo tanto, compruebe sinameestá desarmado (y tenga cuidado de desarmarlo primero) .fuente
bash sample.sh -abc file.txtda -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
getoptsbloqueo, 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,getoptsanalice 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