[Linux] Pasar parámetros, getopts, getopt a scripts de Shell


[Linux] parámetros opcionales de getopts_Consejos de Bash: introducción al uso de los parámetros de opción de análisis del comando integrado de getopts

1. Información general

Los parámetros pasados ​​a un script de shell desde la línea de comando también se denominan parámetros posicionales porque el script de shell recibe sus valores en función de la posición de los parámetros. Dentro del script de shell, los usuarios pueden obtener parámetros a través de una serie de variables del sistema. Los nombres de estas variables del sistema son fijos y simples. Como se enumera en la siguiente tabla:

Parámetros del sistema de uso común
nombre de la variable ilustrar
$n Representa el enésimo parámetro pasado al script, por ejemplo, $1 representa el primer parámetro pasado, $2 representa el segundo parámetro, y así sucesivamente.
ps El número de parámetros pasados
$0 Nombre del script actual
ps Devuelve los valores de todos los parámetros en el formato "Parámetro 1 Parámetro 2..."
ps Devuelve los valores de todos los parámetros en forma de "Parámetro 1" "Parámetro 2"...
ps último parámetro

Aviso:

  • Se pasa como parámetro una cadena entre comillas simples o dobles y las comillas se eliminarán al pasar.
  • Los parámetros que contienen caracteres de espacio u otros símbolos especiales deben pasarse entre comillas simples o dobles para evitar errores de interpretación. Si hay espacios u otros caracteres especiales en los parámetros, no puede usar ∗ para obtener todos los parámetros. En su lugar, use * para obtener todos los parámetros. En su lugar, usepara obtener todos los parámetros, pero use @.
  • $#El número de parámetros devueltos, excluyendo $0.
  • Si el usuario pasa más de 9 parámetros, no se pueden usar $10 para representar el décimo parámetro. Para obtener el décimo parámetro, el usuario primero procesa o guarda $1, luego usa el comando shift para eliminar el parámetro 1 y reduce todos los parámetros restantes en 1. En este momento, el décimo parámetro se convierte en 9, y así sucesivamente . 9, y así sucesivamente.9 , y así sucesivamente. El valor de # se actualizará para reflejar el número restante de parámetros. Esto hace que sea más fácil iterar a través del código.

Escribe el siguiente guión:

#!/bin/bash
echo "$# paramters num"
echo "$@"
echo "$*"
echo $@
echo $*
echo $_

Ejecute el siguiente comando y los resultados:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-3.sh a "b c" d 111
4 paramters num
a b c d 111
a b c d 111
a b c d 111
a b c d 111
111

2. Ampliación de parámetros

Para casos sencillos, las variables del sistema anteriores también son suficientes. Pero en la práctica, los usuarios no siempre se encuentran con esta sencilla situación. Por ejemplo, para el comando ls que usamos frecuentemente, podemos ingresar

ls -l
ls -la
ls -lrt

Esperar a que diferentes parámetros realicen diferentes operaciones, simplemente usar $1, $2... ya no puede cumplir con los requisitos. En este momento, necesitamos usar la expansión de parámetros. El comando getopts se usa en el programa Shell. A continuación, hablaremos sobre cómo usarlo en detalle.

2.1 opciones de obtención

Nota: getopts es un comando integrado de bash. Para los comandos integrados de bash, no puede utilizar el comando man para ver sus instrucciones de ayuda.
Para helpver usando el comando. ayuda a obtener opciones

getopts es un comando compatible con bash. La sintaxis básica de getopts es la siguiente:

getopts optstring [arg]

optstring es una cadena que contiene una lista de nombres de opciones reconocidas por el comando getopts. Representamos un carácter, donde la sintaxis es:

Contenido de la opción ilustrar
       : Si optsring comienza con:, indica modo silencioso e ignora los mensajes de error generales.
      s Opciones válidas y no seguidas de valores de parámetros.
      es : Opciones válidas y deben ir seguidas de valores de parámetros.

getopts recorrerá cada opción por turno y guardará el nombre de la opción en arg, y OPTARG guardará el valor del parámetro para la opción.

Ilustremos con un ejemplo:

#!/bin/bash
 
#input paramters index
echo "OPTIND starts at $OPTIND"
#get paramters
while getopts ":pq:x::" optname              # while在迭代时,系统语法会检查当前项是否合法
 do                                #当前项合法后,才会进入do 语句
 case "$optname" in                           
        "p")            #p
          echo "Option $optname is specified"
          ;;
        "q")            #q
          echo "Option $optname has value $OPTARG"
          ;;
        "?")             #
          echo "Unknown option $OPTARG"
          ;;
        ":")
          echo "No argument value for option $OPTARG"
          ;;
        *)                 #出现上述枚举项之外的项,会进入该分支
          # Should not occur
          echo "Unknown error while processing options"
          ;;
 esac
 echo "OPTION is now $OPTIND"
done

":pq:" significa:

  • getopts ignora los mensajes de error; -p no va seguido de parámetros, -q va seguido de parámetros

  • OPTIND es una variable del sistema que indica la posición del subíndice del parámetro de solicitud getopts actual.

Ejecute los siguientes comandos y resultados:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-4.sh -p -q 12
OPTIND starts at 1
Option p is specified
OPTION is now 2
Option q has value 12
OPTION is now 4

Tenga en cuenta que los siguientes comandos también pueden tener el mismo efecto:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-4.sh -pq 12
OPTIND starts at 1
Option p is specified
OPTION is now 1
Option q has value 12
OPTION is now 3

Esto muestra que tanto -p -q 12 como -pq 12 pueden lograr nuestro objetivo. Por lo tanto, las opciones se pueden usar juntas, al igual que el comando ls que usamos habitualmente: ls -lrt tiene el mismo efecto que ls -l -r -t.

Entonces, ¿qué pasa si queremos que la opción admita formato ancho, por ejemplo cuando usamos cmake?

cmake -DCMAKE_TOOLCHAIN_FILE=arm-toolchain.cmake .

¡Este tipo de getopts no es compatible! ! ! Necesitamos usar otro comando getopt

2.2 rematado

A diferencia de getopts, que es un comando integrado de bash, getopt es un comando externo, que generalmente se incluye con las distribuciones de Linux.

Podemos ver la diferencia usando el comando tipo.

eden_ubuntu@edenubuntu:~/Documents/Shell$ type getopts
getopts is a shell builtin
eden_ubuntu@edenubuntu:~/Documents/Shell$ type getopt
getopt is hashed (/usr/bin/getopt)

Tres formas de utilizar getopt :

# 第一种:无法处理带有空格的参数
getopt optstring parameters
# 第二种:可以处理带有空格的参数,但是需要结合eval使用
getopt [options] [--] optstring parameters
# 第三种:结合eval既可以处理带有空格的参数,也可以定义长选项(一个字母为短选项,一个字母以上是长选项)
getopt [options] -o|--options optstring [options] [--] parameters

  • opciones: definiciones de parámetros que vienen con getopt
  • optstring: parámetros de opción personalizados, por ejemplo, la
    opción -a -b puede ir seguida de dos puntos (:), dos dos puntos o ningún dos puntos.
  • parámetros: parámetros, es decir, valores de parámetros, que se permiten estar vacíos

La diferencia entre dos puntos (:), dos dos puntos y ningún dos puntos después de la opción

  • Sin dos puntos (:): cuando se ejecuta, solo hay opciones y no hay parámetros.
  • Dos puntos (:): debe ejecutarse con parámetros (obligatorio).
  • Dos dos puntos (:): opcionalmente puede ejecutar con o sin parámetros (opcional).

getopt admite opciones cortas y opciones largas, -oseguidas --optionde opciones cortas -lo --longde opciones largas:

  • El formato de opción corta es -a -b, que es una letra de longitud 1
  • El formato de opción larga es -nombre, es decir, varias letras.
  • Si el parámetro es necesario, el valor del parámetro de la opción corta puede ser un espacio o puede ir seguido de la opción -c arg o -carg; el valor del parámetro de la opción larga puede ser un espacio o puede ser = conexión, -clong arg o clong=arg
  • Si el parámetro es opcional, el valor del parámetro de la opción corta solo puede estar cerca de la opción, -carg; el valor del parámetro de la opción larga solo puede ser = concatenación, -clong=arg
#!/bin/bash
 
echo original parameters=[$@]
 
#-o或--options选项后面是可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,
#其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
#-l或--long选项后面是可接受的长选项,用逗号分开,冒号的意义同短选项。
#-n选项后接选项解析错误时提示的脚本名字
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n "$0" -- "$@"`
if [ $? != 0 ]; then
    echo "Terminating..."
    exit 1
fi
 
echo ARGS=[$ARGS]
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"
echo formatted parameters=[$@]
 
while true
do
    case "$1" in
        -a|--along) 
            echo "Option a";
            shift
            ;;
        -b|--blong)
            echo "Option b, value=$2";
            shift 2
            ;;
        -c|--clong)
            case "$2" in
                "")
                    echo "Option c, no value";
                    shift 1  
                    ;;
                *)
                    echo "Option c, value=$2";
                    shift 2;
                    ;;
            esac
            ;;
        --)
            shift
            echo "shift"
            break
            ;;
        *)
            echo "Internal error!"
            exit 1
            ;;
    esac
done

Comando de ejecución y resultados:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-5.sh -a -b 1 --clong=2
original parameters=[-a -b 1 --clong=2]
ARGS=[ -a -b '1' --clong '2' -- ]   //clong参数后面的值为 ‘2’
formatted parameters=[-a -b 1 --clong 2 -- ]
Option a
Option b, value=1
Option c, value=2
shift

Si --clong=2se cambia a -clong 2, los resultados son los siguientes:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-5.sh -a -b 1 --clong 2
original parameters=[-a -b 1 --clong 2 ]
ARGS=[ -a -b '1' --clong '' -- '2' 'test1' 'test2']      //clong参数后面的值为 ‘’
formatted parameters=[-a -b 1 --clong -- 2 ]
Option a
Option b, value=1
Option c, no value
shift

referencia

Aprendizaje del sistema Shell: pasar parámetros a los scripts de Shell
Explicación detallada del comando Linux-getopt

Supongo que te gusta

Origin blog.csdn.net/m0_45406092/article/details/133276390
Recomendado
Clasificación