Когда вы используете shift 2
во внутреннем case
, вы смещаете $1
и $2
, но не $3
, имя файла.
Вам потребуется выполнить отдельный цикл для анализа параметров подкоманд mode1
и mode2
.
Предполагая, что когда в аргументе командной строки скрипта находится подкоманда, остальные параметры и аргументы -параметров принадлежат этой подкоманде, вы можете разделить синтаксический анализ следующим образом:
run_mode1 () {
while [ "$#" -gt 0 ]; do
case "$1" in
-h | --help)
usage_mode1
exit
;;
-1 | --option1)
val1="$2"
shift 2
;;
-2 | --option2)
val2="$2"
shift 2
;;
*)
echo "ERROR: unknown parameter $1"
usage_mode1
exit 1
;;
esac
done
# code for actually running mode1 goes here
}
while [[ $# -gt 0 ]]
do
case "$1" in
-h | --help)
usage_general
exit
;;
mode1)
shift
run_mode1 "$@"
break
;;
*)
echo "ERROR: unknown parameter $1"
usage_general
exit 1
;;
esac
done
Здесь мы запускаем функцию оболочки, как только встречаем mode1
среди аргументов командной строки. Эта функция занимается синтаксическим анализом остальной части списка аргументов.
Это, очевидно, будет работать только в определенных обстоятельствах, когда все опции для сценария(не для подкоманды )происходят до любой заданной подкоманды в командной строке, и что может быть только одна подкоманда с параметрами, заданными при любом вызове сценария.
Можно было бы реализовать парсинг командной строки таким образом, чтобы скрипт мог одновременно принимать две или более подкоманд с параметрами, как в
./script.sh...options... mode1...options... mode2...options...
но пока оставлю это.