2017-01-12 1 views
0

У меня есть сценарий myscript, который должен сделать следующее:Используйте дополнительный аргумент перед тем опционами на командной строки в скрипте Баш

  1. Выполнить по себе: myscript
  2. Запуск с аргументом: myscript myarg
  3. Запуск с параметрами: myscript -a 1 -b 2 -c 3 ...
  4. Запуск с аргументом и опций: 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 

Если есть простое решение этой проблемы, я был бы очень благодарен!

+2

Вы думаете использовать сдвиг, чтобы избавиться от первого аргумента? – linuxfan

+0

Это действительно супер просто, спасибо! Я думаю, вопрос может быть закрыт, вы хотите опубликовать его в качестве ответа? Или я должен написать ответ? Один из возможных недостатков решения: 'if [condition] then ... shift ... fi' следует использовать до вызова' getopts', что может быть проблемой (но не в моем случае). – snurden

+0

Если вы не хотите поддерживать 'myscript -a 1 myarg -b 2 -c 3', не будет проблем с запуском' if [[$ 1 == myarg]]; затем сдвиг; ...; fi' перед циклом 'getopts'. – chepner

ответ

1

Вы можете использовать shift в последних if сценария (общая идея уже существует, поскольку вы пишете «делаете материал с первым аргументом», если он есть, и это не просто вариант »).

Смежные вопросы