2010-11-15 6 views
29

quiero apoyar ambas opciones cortas y largas en bash secuencias de comandos, por lo que uno puede:Cómo admitir opciones cortas y largas al mismo tiempo en bash?

$ foo -ax --long-key val -b -y SOME FILE NAMES 

es posible?

+1

Ver [BashFAQ/035] (http://mywiki.wooledge.org/BashFAQ/035). –

+0

Aunque el duplicado nominado pregunta específicamente sobre 'getopts', hay varias respuestas que sugieren diferentes enfoques. Estoy de acuerdo con el cierre. – tripleee

Respuesta

37

getopt es compatible con opciones largas.

http://man7.org/linux/man-pages/man1/getopt.1.html

Aquí hay un ejemplo usando sus argumentos:

#!/bin/bash 

OPTS=`getopt -o axby -l long-key: -- "[email protected]"` 
if [ $? != 0 ] 
then 
    exit 1 
fi 

eval set -- "$OPTS" 

while true ; do 
    case "$1" in 
     -a) echo "Got a"; shift;; 
     -b) echo "Got b"; shift;; 
     -x) echo "Got x"; shift;; 
     -y) echo "Got y"; shift;; 
     --long-key) echo "Got long-key, arg: $2"; shift 2;; 
     --) shift; break;; 
    esac 
done 
echo "Args:" 
for arg 
do 
    echo $arg 
done 

salida de $ foo -ax --long-key val -b -y SOME FILE NAMES:

Got a 
Got x 
Got long-key, arg: val 
Got b 
Got y 
Args: 
SOME 
FILE 
NAMES 
+9

Algunas versiones de 'getopt' tienen problemas con algunos caracteres en argumentos y parámetros que no son de opción. Si 'getopt --test; echo $? 'muestra" 4 ", está bien. Si emite "0", tiene una versión con este problema. Ver ['man getopt'] (http://linux.die.net/man/1/getopt) para más información. –

+0

Y también el entorno POSIXLY_CORRECT es útil. –

+0

Xiè Jìléi: ¿Por qué? ¿Cómo se establece eso? – Christoph

Cuestiones relacionadas