#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 ]]
Кстати, ваша строка онлайн-справки пуста, что тоже не помогает отладке 🙂