GNU/Linux >> Tutoriales Linux >  >> Linux

Bash - Analizar banderas y un argumento esperado (no opcional)?

$ bash file.sh expected_arg -f optional_arg

He visto publicaciones que tratan con $1 para agarrar el primer argumento

y publicaciones que abordan el uso de getopts para analizar argumentos de bandera. No he visto una publicación que aborde ambos.

Actualmente estoy accediendo a expected_arg a través de $1 .

No puedo procesar el -f bandera en absoluto. Aunque también tengo esto en mi script de prueba:

#!/bin/bash

dirname=$1

[[ -z  $dirname  ]] && echo "Project name required as an argument." && return

# get flags
verbose='false'
aflag='false'
bflag='false'
files='false'
while getopts 'abf:v' flag; do
  case "${flag}" in
    a) aflag='true' ;;
    b) bflag='true' ;;
    f) files="${OPTARG}" ;;
    v) verbose='true' ;;
    *) error "Unexpected option ${flag}" ;;
  esac
done

echo "$files"

echo "$HOME/Desktop/$dirname"

exit

La terminal muestra:

Jills-MBP:~ jillr$ bash test.sh blah -f file
false
/Users/jillr/Desktop/blah

A menos que Cambio el orden de los argumentos, como en:

bash file.sh -f optional_arg expected_arg

Que el terminal emite:

Jills-MBP:~ jillr$ bash test.sh -f file blah
file
/Users/jillr/Desktop/-f

Entonces, naturalmente, -f se procesa como $1 , que no es lo que quiero. Necesito agarrar el arg_esperado

Restricciones necesarias:

  • Necesito permitir una cantidad variable de banderas (desde ninguna hasta varias). Por lo tanto, la posición de arg_esperado variará
  • expected_arg es obligatorio
  • Preferiría evitar tener que usar otra marca para analizar arg_esperado (es decir, quiero evitar hacer algo como $ bash test.sh -f file -d blah )

¿Cómo puedo satisfacer esas restricciones?

Respuesta aceptada:

No importa. Encontré esta publicación:Uso de getopts para analizar opciones después de un argumento sin opción

que básicamente dice que puedo resolver mi problema simplemente colocando shift después de dirname=$1

Lo que permitirá ingresar los argumentos como

$ bash file.sh expected_arg -f optional_arg

Linux
  1. Ejemplos de ciclos for y while de Bash

  2. ¿Cómo analizar un archivo CSV en Bash?

  3. Usando y en Bash while loop

  4. Conservar comillas en argumentos bash

  5. ¿Cuál es la diferencia entre #!/usr/bin/env bash y #!/usr/bin/bash?

Declaración Bash declare:sintaxis y ejemplos

Sintaxis y ejemplos de declaraciones de caso Bash

Bash romper y continuar

Comando de salida de Bash y códigos de salida

Los mejores terminales Linux en línea y editores Bash en línea

Bash Scripting:analizar argumentos en Bash Scripts usando getopts