Articulo de referencia

obteneropts

getopts es un comando de shell Unix integrado para analizar argumentos de línea de comandos . Está diseñado para procesar argumentos de línea de comandos que siguen las pautas d...

getoptses un comando de shell Unix integrado para analizar argumentos de línea de comandos . Está diseñado para procesar argumentos de línea de comandos que siguen las pautas de sintaxis de utilidades POSIX, basadas en la interfaz C de getopt .

El predecesor getoptsfue el programa externo getoptde Unix System Laboratories .

Historia

El original getopttenía varios problemas: no podía manejar espacios en blanco o metacaracteres de shell en los argumentos y no había posibilidad de desactivar la salida de mensajes de error. [1]

getoptsSe introdujo por primera vez en 1986 en el shell Bourne que se incluía con Unix SVR3. Utiliza las propias variables del shell para rastrear la posición actual y de los argumentos, OPTIND y OPTARG , y devuelve el nombre de la opción en una variable del shell. [2] Las versiones anteriores del shell Bourne no tenían getopts .

En 1995, getoptsse incluyó en la versión 1 de la Especificación Única de UNIX / X/Open Portability Guidelines Issue 4. [3] Como resultado, getoptsahora está disponible en shells que incluyen Bourne shell , KornShell , Almquist shell , Bash y Zsh . [4]

El comando getopts también ha sido portado al sistema operativo IBM i . [5]

El uso moderno de getoptfue parcialmente revivido debido principalmente a una implementación mejorada en util-linux . Esta versión, basada en BSD getopt, no solo solucionó las dos quejas sobre el antiguo getopt, sino que también introdujo la capacidad de analizar opciones largas al estilo GNU y argumentos opcionales para opciones, características de las que getoptscarecía. [6] Sin embargo, las diversas distribuciones de BSD se mantuvieron fieles a la antigua implementación. [1]

Uso

La sinopsis de uso de getopt y getopts es similar a la de su hermano C :

getopt optstring  [parámetros] 
getopts optstring  varname  [parámetros]
  • La parte optstring tiene el mismo formato que su hermano C.
  • La parte de parámetros simplemente acepta lo que uno quiera que getopt analice. Un valor común son todos los parámetros, "$@" en el shell POSIX.
    • Este valor existe en getopts pero rara vez se utiliza, ya que solo puede acceder a los parámetros del shell. Sin embargo, resulta útil para restablecer el analizador.
  • La parte varname de getopts nombra una variable de shell para almacenar la opción analizada.

Sin embargo, la forma de utilizar los comandos varía mucho:

  • getopt simplemente devuelve una cadena plana que contiene tokens separados por espacios en blanco que representan el argumento "normalizado". Luego se utiliza un bucle while para analizarlo de forma nativa. [1]
  • getopts está pensado para ser llamado repetidamente como getopt en C. Cuando llega al final de los argumentos, devuelve 1 (falso en el shell). [3]

Mejoras

En varios getopts

En la primavera de 2004 (desarrollo beta de Solaris 10), se mejoró la implementación de libc para getopt() para admitir opciones largas. Como resultado, esta nueva característica también estaba disponible en el comando integrado de Bourne Shell. Esto se activa mediante sufijos entre paréntesis en la cadena optstring que especifica alias largos. [7]getopts

Tanto KornShell como Zsh tienen una extensión para argumentos largos. El primero se define como en Solaris, [8]zparseopts mientras que el segundo se implementa mediante un comando independiente . [9]

KornShell también implementa extensiones optstring+ para opciones que comienzan con en lugar de -. [8]

En Linux getopt

Una alternativa a getoptses la versión mejorada de Linux de getopt, el programa de línea de comandos externo.

La versión mejorada de Linux de getopttiene la seguridad adicional de getoptsademás de funciones más avanzadas. Admite nombres de opciones largos (por ejemplo, --help) y las opciones no tienen que aparecer antes de todos los operandos (por ejemplo, command operand1 operand2 -a operand3 -bestá permitido por la versión mejorada de Linux de getoptpero no funciona con getopts). También admite el escape de metacaracteres para shells (como tcsh y POSIX sh) y argumentos opcionales. [6]

Comparación

Ejemplos

Supongamos que estamos construyendo un descargador de Wikipedia en bash que acepta tres opciones y cero argumentos adicionales:

wpdown -a nombre del artículo -l [idioma] -v

Cuando sea posible, permitimos los siguientes argumentos largos:

-a --artículo
-l --idioma, --lang
-v --verbose

Para mayor claridad, no se incluye ningún texto de ayuda y asumimos que existe un programa que descarga cualquier página web. Además, todos los programas tienen el formato:

#!/bin/bash 
detallado = 0 
artículo = 
idioma = en

# [EJEMPLO AQUÍ]

si (( verbose > 2 )) ; entonces printf '%s\n' 'Argumentos que no son opciones:' printf '%q ' " ${ restante [@]] } " fi    
    
    


si (( verbose > 1 )) ; entonces printf 'Descargando %s:%s\n' " $lang " " $article " fi    
     


si [[ ! $articulo ]] ; entonces printf '%s\n' "¡No hay artículos!" > & 2 salir 1 fi     
     
   


save_webpage "https:// ${ lang } .wikipedia.org/wiki/ ${ article } " 

Usando el antiguo getopt

El antiguo getopt no admite argumentos opcionales:

# analizamos todo; si falla, lo abandonamos 
args = ` getopt 'a:l:v' $* ` || exit # ahora tenemos los argumentos saneados... reemplazamos el original con su conjunto -- $args    

  

mientras sea  verdadero ; hacer caso $1 en ( -v ) (( verbose++ )) ; cambio ;; ( -a ) artículo = $2 ; cambio 2 ;; ( -l ) idioma = $2 ; cambio 2 ;; ( -- ) cambio ; descanso ;; ( * ) salir 1 ;; # error esac hecho 
      
           
           
           
          
                      
    


restante =( " $@ " )

Este script también interrumpirá cualquier título de artículo que contenga un espacio o un metacarácter de shell (como ? o *).

Usando getopts

Getopts le da al script la apariencia de la interfaz C, aunque en POSIX los argumentos opcionales todavía están ausentes:

#!/bin/sh 
while getopts ':a:l:v' opt ; do case $opt in ( v ) (( verbose++ )) ;; ( a ) article = $OPTARG ;; ( l ) lang = $OPTARG ;; ( : ) # "argumentos opcionales" (falta el manejo de argumentos de opción) case $OPTARG in ( a ) exit 1 ;; # error, de acuerdo con nuestra sintaxis ( l ) : ;; # aceptable pero no hace nada esac ;; esac done    
      
         
         
         
         
              
                 
                     
            
    


shift " $(( OPTIND - 1 )) " # lo restante es "$@"   

Dado que ya no operamos directamente sobre las opciones del shell, ya no necesitamos desplazarlas dentro del bucle. Sin embargo, se requiere una operación de segmentación para eliminar las opciones analizadas y dejar los argumentos restantes.

Es bastante simple emular el soporte de opciones largas de indicadores al tratar --fastcomo un argumento fasta una opción -. Es decir, -:se agrega a la cadena de opciones y -se agrega como un caso para opt, dentro del cual OPTARGse evalúa para una coincidencia con fast. Admitir opciones largas con un argumento es más tedioso, pero es posible cuando las opciones y los argumentos están delineados por = . [10]

Uso de getopt para Linux

Getopt de Linux escapa de su salida y se necesita un comando "eval" para que el shell lo interprete. El resto no cambia:

#!/bin/bash

# Usamos "${@}" en lugar de "${*}" para preservar la información de los límites de los argumentos 
args = $( getopt  --options 'a:l::v' --longoptions 'article:,lang::,language::,verbose' -- " ${ @ } " ) || exit eval "set -- ${ args } "       
 

mientras sea  verdadero ; hacer caso " ${ 1 } " en ( -v | --verbose ) (( verbose++ )) shift ;; ( -a | --article ) article = ${ 2 } shift 2 ;; ( -l | --lang | --language ) # manejador opcional: getopt lo normaliza en una cadena vacía if [[ -n ${ 2 } ]] ; then lang = ${ 2 } fi shift 2 ;; ( -- ) shift break ;; ( * ) exit 1 # error ;; esac hecho 
      
          
            
            
        
          
            
             
        
            
            
                  
                
            
             
        
        
            
            
        
        
                 
        
    


argumentos_restantes =( " ${ @ } " )

Véase también

Referencias

  1. ^ abc getopt(1) –  Manual de comandos generales de FreeBSD
  2. ^ Mascheck, Sven. "La familia Bourne Shell tradicional" . Consultado el 1 de diciembre de 2010 .
  3. ^ ab "getopts". El Grupo Abierto (POSIX 2018) .
  4. ^ "Manual de referencia de Bash".
  5. ^ IBM . "Programación Qshell para IBM System i versión 7.2" (PDF) . IBM . Consultado el 5 de septiembre de 2020 .
  6. ^ ab getopt(1) –  Manual de comandos generales de Linux
  7. ^ "getopt(3)". Biblioteca de información de Oracle Solaris 11.2 .
  8. ^ ab "ksh getopts - analiza las opciones desde la línea de comandos del script de shell". www.mkssoftware.com .
  9. ^ zshmodules(1)  –  Manual de comandos generales de Linux
  10. ^ "Un analizador CLI simple en Bash".
Obtenido de "https://es.wikipedia.org/w/index.php?title=Getopts&oldid=1225331518"