Проблемы с хранением аргументов из getopts в сценарии оболочки

#bash #unix #arguments #getopts

Вопрос:

Я новичок в unix и недавно попытался создать код, который принимал бы некоторые аргументы и передавал их в скрипт python, а затем использовал бы эти аргументы для последующих процессов.

Я пытаюсь использовать getopts, но после того, как я попытался запустить скрипт, похоже, что мои аргументы не были сохранены в переменных, и что-то ниже по потоку не удалось.

Это часть того, что я пробовал до сих пор

 #!/bin/bash
function usage() {
    cat <<USAGE

    Usage: $0 [-f fasta] [-o output name] [-m memory] [-t time] [-n number of tasks] [-c cores] [-g gpus] [-e extra]

    Options:
        -f  fasta file
        -o  output name
        -m  memory to request
        -t  time to request
        -n  number of tasks
        -c  cores to request
        -g  gpus to request - no more than 4!
        -e  extra arguments for program
USAGE
}

while getopts ":f:o:m:t:n:c:g:e:h" flag
do
    case "${flag}" in
        f)
          fasta=${OPTARG}
            ;;
        o)
          out_name=${OPTARG}
            ;;
        m)
          memory=${OPTARG}
            ;;
        t)
          time=${OPTARG}
            ;;
        n)
          number=${OPTARG}
            ;;
        c)
          cores=${OPTARG}
            ;;
        g)
          gpus=${OPTARG}
            ;;
        e)
          extra=${OPTARG}
            ;;
        h)
          usage
            ;;
        :)
          echo "Invalid option: $OPTARG" 1>amp;2
          usage
          exit 1
            ;;
        ?)
            echo "Invalid option"
            usage
            exit 1
            ;;
    esac
done

python3 /scratch/amolinav/programs/my_script_single.py ${fasta} ${out_name} ${memory} ${time} ${number} ${cores} ${gpus} ${extra}
 

Я был бы очень признателен, если бы кто-нибудь мог указать, где я совершаю ошибку.
Заранее большое вам спасибо за вашу помощь

Комментарии:

1. Ваш сценарий выглядит нормально-проверьте его с помощью shellcheck. сеть для исправления некоторых проблем с цитированием. Но выглядит все нормально. it looks like На что именно «похоже»? Не могли бы вы показать нам, на основании чего вы делаете предположение, что аргументы не были сохранены? Добавьте set -x во вторую строку скрипт и запустите его повторно- отладьте его.

2. Вы должны защищать переменные двойными кавычками при использовании их содержимого (например fasta="$OPTARG" , или .../my_script_single.py "$fasta" "$out_name" ... ). Кроме того, getopts это сложно , так как он перестает перебирать аргументы при обнаружении не-опции (например, ./myscript.sh whatever -f file.fasta не заполнит fasta="$OPTARG" , но ./myscript.sh -f file.fasta whatever будет).

3. @KamilCuk Поскольку код не удался, я попытался повторить переменные в конце (например echo "${fasta}" ) и получил пустую строку. И спасибо, что указали на проблемы с цитированием, я исправил это

4. @Fravadona спасибо вам за ваш ответ. Я исправил цитату, но мои переменные все еще не заполняются, и я не могу найти причину, по которой

5. Итак, как вы называете программу? Я протестировал вашу программу replit.com/@kamilcukrowski/LooseTreasuredSeptagon#main.sh для меня это прекрасно работает. Что еще вы можете нам рассказать?