Я использую стандартную логику getopts. Но я хочу, чтобы варианты, которые я предлагаю, были взаимоисключающими. например
shell.sh -a SID
<accepted>
shell.sh -b SID
<accepted>
shell.sh -ab SID
Message- using ab together is the same as running shell.sh without any options supplying just SID . Help usage < ya da ya >
shell.sh
Please enter SID at the minimum. Usage < ya da ya >
shell.sh SID
<accepted>
Я пытаюсь разработать эту логику, используя что-то вроде ниже
while getopts ":a:b:" opt; do
case $opt in
a ) SID="$OPTARG";;
set var=1
b ) SID="$OPTARG";;
set var=2
\?) echo "Invalid option: -"$OPTARG"" >&2
exit 1;;
) echo "Option -"$OPTARG" requires an argument." >&2
exit 1;;
esac
done
If (( val == 1 )) then ; # option a is invoked SID supplied
<stuff>
elif (( val == 2 )) then ; # option b is invoked SID supplied
<stuff>
else # SID supplied but neither a or b is invoked
<stuff>
fi
Как применять взаимоисключающие флаги. Я уверен, что есть и другие акробатические способы сделать это. Я думаю, что мне не хватает чего-то здравого смысла, и я пытаюсь понять это. Спасибо
$ more opt.ksh
die () {
echo "ERROR: $*. Aborting." >&2
return 1
}
var=
while getopts ":a:b:" opt; do
case $opt in
a ) SID="$OPTARG"
[ "$var" = 2 ] && die "Cannot specify option a after specifying option b"
[ "$OPTARG" = b ] && die "Do not specify b as a value for option a"
var=1
;;
b ) SID="$OPTARG"
[ "$var" = 1 ] && die "Cannot specify option b after specifying option a"
[ "$OPTARG" = a ] && die "Do not specify a as a value for option b"
var=2
;;
:) die "Must supply an argument to $OPTARG"
;;
\?) die "Invalid option: -$OPTARG. Abort"
;;
esac
done
shift $(($OPTIND - 1))
[ "$SID" ] || SID=$1
[ "$SID" ] || die "You must, at the minimum, supply SID"
я использую кш
$ ps -p $$
PID TTY TIME CMD
1261 pts/45 00:00:00 ksh
1 раз запускаю.
$ . opt.ksh -a 123 -b 123 # c0
ERROR: Cannot specify option b after specifying option a. Aborting.
-bash: /home/d1ecom1/gin1: No such file or directory
$ . opt.ksh -ab 123 # c1 should reject "cant use a and b togather. try with a or b"
-nologin: .[25]: shift: 4: bad number
$ . opt.ksh -a -b # c2 same as c1's message
$ . opt.ksh -a -b 123 # c3 same as c1
$ . opt.ksh -a -b 123 # c5
$ . opt.ksh -ab 123 # c6
$ . opt.ksh -a 123 -b 123 # c7
Все вышеперечисленные случаи C0:C7 следует отклонить. Обратите внимание, что C0 и C7 одинаковы. Тем не менее, несмотря на это, C0 дает ожидаемую ошибку, а C7 не дает никакой ошибки? странный
должны работать только те
. opt.ksh -a 123
. opt.ksh -b 123
. opt.ksh 123
@hvd: TYSM за ваш ответ. Я хотел бы добавить дополнительный флаг -p, который даст опцию «переопределения пути». поэтому, возможно, нам нужно расширить getopt, чтобы принимать такие параметры
die () {
echo "ERROR: $*. Aborting." >&2
exit 1
}
var=
opta=false
optb=false
while getopts ":ab:p" opt; do
case $opt in
a ) $optb && die "Cannot specify option a after specifying option b"
opta=true
;;
b ) $opta && die "Cannot specify option b after specifying option a"
optb=true
;;
p ) [ -d "$mypath" ] && die "path is invalid"
;;
\?) die "Invalid option: -$OPTARG. Abort"
;;
esac
done
shift $(($OPTIND - 1))
test $# -eq 0 && die "You must supply SID"
test $# -eq 1 || die "Too many command-line arguments"
# SID=$1
Выше был старый подход. Теперь у меня есть 2 входных параметра. Один — это SID, а другой — путь. Это так же просто, как указано выше, или мне нужно добавить больше проверок, чтобы предотвратить другие нежелательные комбинации. Вопрос, который я пытаюсь задать, заключается в том, что еще нужно сделать, чтобы разрешить этот параметр -p, который является необязательным параметром переопределения. - p может сосуществовать с любым указанным выше параметром, но тогда, я думаю, одно требование состоит в том, что он должен следовать сразу за флагом -p, поэтому это не должно разрешаться, потому что это не ясно.
shell.sh -b -p 123 /home/yadaya
Спасибо еще раз
-a
и-b
, которые не принимают никаких аргументов (отбрасывая:
), и всегда будете проверять, был ли предоставлен не-параметр в качестве SID, это уже будет работать должным образом. - person   schedule 11.02.2014shift $(($OPTIND - 1))
/[ "$SID" ] || die "You must, at the minimum, supply SID"
), которые вы теперь превратили в комментарии, чтобы отклонить-a
сам по себе. Вскоре я превращу свой подход в ответ. - person   schedule 11.02.2014-a
/-b
, мне кажется, что это будет хорошо работать в качестве аргумента опции (:abp:
, а не:ab:p
). В вашем случаеp)
просто установитеmypath=$OPTARG
(и подтвердите при необходимости). Остальные проверки останутся прежними, потому что у вас по-прежнему будет только один необязательный аргумент. Однако, хотя-p /path -a 123
кажется вполне допустимым и будет разрешено, то же самое можно сказать и о-a -p /path 123
, однако-a 123 -p /path
будет отклонено. Вы можете решить, имеет ли это для вас смысл. - person   schedule 15.02.2014-a 123 -p /path
(тот последний) - это тоже не кажется правильным, потому что, если значение для -p следует сразу за ним. Shell может понять это. То, что смутит оболочку, это что-то вроде-a -p 100 /path
, потому что теперь я поменял значения. Такие комбинации, которые я хочу отсеять.. или, может быть, я слишком внимательно смотрю на это и могу предположить, здравый смысл не проверяет все неправильные случаи - person user1874594   schedule 15.02.2014-a 123 -p /path
не будет допустимым, потому что123
является аргументом без опций, а аргументы без опций не могут сопровождаться опциями.-a -p 100 /path
будет обнаружен вашей проверкой того, что аргумент для-p
должен быть допустимым путем, если пользователь не выполняетmkdir 100
. И если пользователь создаст этот каталог, то100
будет допустимым аргументом для-p
. - person   schedule 15.02.2014( [ -z $OPTARG ] && [ -d "$OPTARG" ] ) || die "message"
будет работать. Я хочу, чтобы оба эти условия были верны, иначе я умру. Может быть, вы поможете написать это лучше. еще раз спасибо - person user1874594   schedule 15.02.2014[ -d "$OPTARG" ]
возвращает код успеха, который вы хотите отклонить? - person   schedule 15.02.2014-z
, а затем проверить, является ли это значение допустимым каталогом. У меня была мысль, что-d
это проверит. Может быть, я ошибаюсь в синтаксисе. Как бы еще сказать. (значение присутствует && его действующий каталог) или умрет. - person user1874594   schedule 15.02.2014[ -d "$OPTARG" ]
уже должен обрабатывать этот случай, и для меня это так. - person   schedule 15.02.2014