У меня есть сценарий myscript
, который должен сделать следующее:Используйте дополнительный аргумент перед тем опционами на командной строки в скрипте Баш
- Выполнить по себе:
myscript
- Запуск с аргументом:
myscript myarg
- Запуск с параметрами:
myscript -a 1 -b 2 -c 3 ...
- Запуск с аргументом и опций:
myscript myarg -a 1 -b 2 -c 3 ...
Я не могу получить 4. работать, кажется, что использование аргумента перед параметрами (которое я беру с getopts
) мешает тому, как getopts
обрабатывает все.
код, я использую в основном как это:
while getopts "a:b:c:" opt; do
case ${opt} in
a)
var_a=$OPTARG
;;
... more options here
esac
done
if [ ! -z "$1" ] && [[ ! "$1" =~ ^- ]]; then
... do stuff with first argument - if it's there and it's not just an option
fi
Если есть простое решение этой проблемы, я был бы очень благодарен!
Вы думаете использовать сдвиг, чтобы избавиться от первого аргумента? – linuxfan
Это действительно супер просто, спасибо! Я думаю, вопрос может быть закрыт, вы хотите опубликовать его в качестве ответа? Или я должен написать ответ? Один из возможных недостатков решения: 'if [condition] then ... shift ... fi' следует использовать до вызова' getopts', что может быть проблемой (но не в моем случае). – snurden
Если вы не хотите поддерживать 'myscript -a 1 myarg -b 2 -c 3', не будет проблем с запуском' if [[$ 1 == myarg]]; затем сдвиг; ...; fi' перед циклом 'getopts'. – chepner