Код Linux bash не выполняется в цикле while-do

#bash

#bash

Вопрос:

У меня есть цикл while-do в скрипте BASH .sh, который выполняет простой синтаксический анализ параметров командной строки. Когда я передаю определенные параметры, они анализируются без проблем (а именно параметры -w, -s , -d ). Но если я передам какой-либо другой параметр, похоже, что цикл ничего не делает, и скрипт продолжает выполнять код после окончания цикла while.

Ни одна из команд «echo» ничего не выводит. Примеры -h, —help , -c , —complete, -e . Я даже пробовал использовать нераспознанные параметры, такие как -a -f и т.д.

Любая помощь, пожалуйста? Цикл while является:

 while [[ $# -gt 1 ]]
do
key="$1"
src_not_valid=false
dst_not_valid=false
site_not_valid=false
complete_bucket_copy=false
exclude_worker=false

echo key $key

case $key in
    -w|--website)
    SITE="$2"
    shift # past argument
    ;;
    -s|--source)
    SRC_ENV="$2"
    shift # past argument
    ;;
    -d|--dest)
    DST_ENV="$2"
    shift # past argument
    ;;
    -c|--complete)
    echo "Complete bucket copy option ON"
    complete_bucket_copy=true
    ;;
    -e|--exlude-worker)
    echo "Exclude worker option ON"
    exclude_worker=true
    ;;
    -h|--help)
    echo $str_help
    exit
    ;;
    *)
            # unknown option
    echo "$2 option not recognizedrn$usage"
    exit
    ;;
esac
shift # past argument or value
done
  

ОБНОВЛЕНИЕ: я забыл упомянуть, что все работающие параметры принимают аргумент, например «script-name.sh -в фу -с бар -ди джон»
Но параметры, которые не работают, не содержат аргументов, examples -h или —help

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

1. извините, я добавил его позже, но даже этот «выход» не имеет эффекта, если я передаю параметр, отличный от -w , -s или -d.

2. Используемый вами тест (написан в арифметическом синтаксисе): (( $# > 1 )) (да, -gt больше ), но вы имеете в виду (( $# >= 1 )) : так что используйте [[ $# -ge 1 ]] ( -ge больше или равно ); или еще лучше, просто используйте арифметический контекст (потому что это то, что вы делаете: арифметика): while (( $# >= 1 )); then ; или даже while (($#)); then .

3. @gniourf_gniourf Спасибо, это работает! Я не могу добавить вам 1 голос на данный момент: (

Ответ №1:

вы даже не вводите в цикл, когда есть только один аргумент.

Вы должны изменить while [[ $# -gt 1 ]] while [[ $# -ge 1 ]]

Кстати, ваша строка онлайн-справки пуста, что тоже не помогает отладке 🙂