es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Análisis de argumentos opcionales y no opcionales.

Soy nuevo con bash y después de leer e intentar mucho acerca de cómo analizar los argumentos, no puedo lograr lo que realmente quiero hacer. Quiero analizar argumentos opcionales y no opcionales. Específicamente, quiero analizar 3 argumentos: el primero (un archivo fastaq), el segundo (un segundo archivo fastaq opcional) y un tercer argumento que será un directorio.

mi_script.sh -f1 archivo1.fasta --f2 archivo2.fasta -d /home/carpeta1/carpeta2
o
mi_script.sh -f1 archivo1.fasta -d /home/carpeta1/carpeta2

He intentado hacer esto de muchas formas, pero no sé cómo hacer que el programa identifique cuando hay dos archivos fasta y un directorio, y cuando hay solo un archivo fasta y un directorio.

Con estos argumentos, quiero guardarlos en variables porque serán utilizados posteriormente por terceros.

He intentado esto:

for i in "$@"; do
  case $i in
    -f1=|-fasta1=)
      FASTA1="${i#=}"
      shift # pasar argumento=valor
      ;;
    -d) DIRECTORY=$2
      shift 2
      ;;
    -d=|-directory=) DIRECTORY="${i#=}"
      shift # pasar argumento=valor
      ;;
    --f2=|-fasta2=) FASTA2="${i#*=}"
      shift # pasar argumento=valor
      ;;
    *)
      ;;
  esac
done

Pero solo obtengo esto:

[scripts_mi_primera_NGS]$ ./ejecutar.sh -f1 fasta.fasta -d /home/carpeta1
FASTA1 =
DIRECTORIO =
FASTA2 =
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para analizar los argumentos opcionales y no opcionales, puedes utilizar el comando getopt o la función integrada getopts en bash.

    Aquí tienes un ejemplo de cómo usar getopts para analizar los argumentos:

    #!/bin/bash
    
    while getopts ":f1:f2:d:" opt; do
      case $opt in
        f1)
          FASTA1=$OPTARG
          ;;
        f2)
          FASTA2=$OPTARG
          ;;
        d)
          DIRECTORY=$OPTARG
          ;;
        \?)
          echo "Opción inválida: -$OPTARG" >&2
          exit 1
          ;;
        :)
          echo "La opción -$OPTARG requiere un argumento." >&2
          exit 1
          ;;
      esac
    done
    
    if [ -z "$FASTA1" ] || [ -z "$DIRECTORY" ]; then
      echo "Uso: $0 -f1 <fasta1> [-f2 <fasta2>] -d <directorio>"
      exit 1
    fi
    
    echo "FASTA1: $FASTA1"
    echo "FASTA2: $FASTA2"
    echo "DIRECTORIO: $DIRECTORY"
    

    Puedes ejecutar el script con los siguientes comandos:

    ./my_script.sh -f1 file1.fasta -d /home/folder1/folder2
    
    ./my_script.sh -f1 file1.fasta -f2 file2.fasta -d /home/folder1/folder2
    

    El script comprobará si se proporcionaron FASTA1 y DIRECTORIO y mostrará un mensaje de error si faltan. Guardará sus valores en las variables correspondientes y los mostrará al final.

    Ten en cuenta que el dos puntos después de la letra de la opción especifica que la opción requiere un argumento. Además, el dos puntos inicial en la cadena de getopts hace que el script sea silencioso, por lo que no mostrará mensajes de error para opciones inválidas.

Comments are closed.