#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 для меня это прекрасно работает. Что еще вы можете нам рассказать?