Tengo un script bash como se muestra a continuación en un archivo nepleaks_upd.sh, que quiero ejecutar como ./nepleaks_upd.sh bootstrap --branch off. No se pudo tomar --branch, pero con lo que funciona es ./nepleaks_upd.sh bootstrap -b off.
usage() { echo "Usage: $0 [prepare | up | down]  [-b <on/off>]" 1>&2; exit 1; }                                                                                                 
case "$1" in                                                                                           
               bootstrap)                                                                                  
                  while getopts ":b:" o; do                                                            
                   case "${o}" in                                                                      
                    b)                                                                                 
                        b=${OPTARG}                                                                    
                        if [ ${b} == "off" ]; then                                                      
                               echo "git clone https://github.com/iPrayag/dotfiles.git"  
                               ## logic                                                      
                        fi                                                                             
                        ;;                                                                             
                    *)                                                                                 
                        echo ${o}                                                                      
                        usage                                                                          
                        ;;                                                                             
                   esac                                                                                
                  done                                                                                 
                  shift $((OPTIND-1))                                                                  
                  echo "option1 = ${o}" 
                  echo "option2 = ${b}"                                                                      
                  if [ -z "${b}" ]; then                                                               
                         usage                                                                         
                  fi                                                                                   
                    ;;                                                                                 
                up)                                                                                         
                     echo "up"     
                     ##logic                                                                    
                     ;;                                                                                
                down)                                                                                  
                     echo "down" 
                     ##logic                                                                     
                    ;;                                                                                 
                *)                                                                                     
                    echo "Usage: $0 {up | down} dev"                                                
                    exit 1                                                                             
                    ;;                                                                                 
esac         
Sin primero case  .. in .... esac, funciona bien. Con case ... in ... esac, da la opción en blanco para -b,
$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 = 
Usage: ./nepleaks_upd.sh [bootstrap | up | down]  [-b <on/off>]
                    
                        bash
                                shell-script
                                getopts
                                
                    
                    
                        prayagupd
fuente
                
                fuente

$1?case .. in .... esac, funciona bien"? ¿Quiere decir que las líneas 5-25 se analizan./nepleaks_upd.sh -b offcorrectamente? Tal vez necesite unshift, asígetoptsque no se ahoga con el "bootstrap".Respuestas:
getoptscomienza a analizar en el primer argumento y se detiene en los primeros argumentos sin opciones. Esa es la convención estándar - algunas utilidades GNU aceptan opciones después de argumentos, pero lo normal es que ensomecommand foo -bar qux,-barno se analiza como una opción.Si desea comenzar a analizar las opciones después
bootstrap, debe indicarlo.getoptsusa laOPTINDvariable para recordar en qué posición está.OPTINDcomienza con el valor 1. Para omitir el primer argumento, configúrelo en 2.Alternativamente, podría
shiftutilizar los argumentos que ya ha procesado.fuente