4개의 입력 옵션(x:m:b:v)을 허용하는 쉘 스크립트가 있습니다. 하지만 입력 옵션을 다음과 같이 제한하고 싶습니다.
조건 1
1. Accept option x or x and b
eg: sh script -x <arg> (or) ;will execute function a defined in script
sh script -x <arg> -b ;will execute the functions a and b
조건 2
2. Accept option m or m and b
eg: sh script -m <arg> (or) ;execute function c
sh script -m <arg1> -b ;should execute function for c and b
조건 3
3. Option both x and m should not be passed together.
This will print usage(how to use the input options) function.
조건 4
4. Option v. This should not be passed with any other option.
eg: sh script -v <arg> ; executs the function for v
나는 이것이 if 및 else 조건으로 달성될 수 있다는 것을 알고 있지만 조건에 대한 논리를 얻을 수 없습니다.
또한 입력 인수가 하나도 전달되지 않은 경우(또는) 모든 입력 인수가 전달된 경우 사용법 함수를 실행해야 합니다.
답변1
위의 의견을 설명하기 위한 예로서 다음은 FreeBSD의 내용에서 발췌한 것입니다 /usr/src/bin/cp/cp.c
.
while ((ch = getopt(argc, argv, "HLPRafilnprsvx")) != -1)
switch (ch) {
case 'H':
Hflag = 1;
Lflag = 0;
break;
case 'L':
Lflag = 1;
Hflag = 0;
break;
...
case 'l':
lflag = 1;
break;
...
case 's':
sflag = 1;
break;
case 'v':
vflag = 1;
break;
case 'x':
fts_options |= FTS_XDEV;
break;
default:
usage();
break;
}
위의 내용은 Hflag, Lflag, lflag, sflag 등과 같은 많은 부울 변수를 설정합니다. 이를 통해 코드는 플래그 간의 부울 관계를 테스트할 수 있을 뿐만 아니라 하나의 플래그가 있으면 다른 플래그를 활성화하거나 재정의할 수 있습니다. 또 다른. 또한 사용자가 정의되지 않은 옵션 플래그를 지정할 때 default
문의 절이 호출을 switch
강제한다는 점에 유의하세요.usage()
mflag
&& 금지와 같은 플래그 제외와 관련하여 xflag
비슷한 경우가 cp.c에 나타납니다.
if (lflag && sflag)
errx(1, "the -l and -s options may not be specified together");
bash
다음은 해당 코드를 C에서 예제에 추가로 적용하여 번역할 수 있는 것입니다 .
flagb=
flagm=
flagv=
flagx=
while getopts "bm:vx:" ch
do
case "$ch" in
[bv])
eval flag$ch=1
printf 'flag%s set\n' "$ch"
;;
[mx])
eval flag$ch=1
eval arg$ch=\"$OPTARG\"
printf 'flag%s set\n' "$ch"
printf 'arg%s is "%s"\n' "$ch" "$OPTARG"
;;
-)
break
;;
esac
done
[[ $OPTIND > 1 ]] && shift $(($OPTIND-1))
if [[ "$flagv" ]]
then
if [[ -n "$flagb$flagm$flagx" ]]
then
printf 'error: -v cannot be used with any other flags\n' >&2
exit 2
fi
fi
if [[ "$flagm$flagx" = "11" ]]
then
printf 'error: -m and -x cannot be used together\n' >&2
exit 2
fi
if [[ "$flagb" ]] && ! [[ "$flagm$flagx" ]]
then
printf 'error: -b requires either -m or -x\n' >&2
exit 2
fi
[[ "$flagb" ]] && printf 'b flag is set\n'
[[ "$flagm" ]] && printf 'm flag is set, arg is "%s"\n' "$argm"
[[ "$flagv" ]] && printf 'v flag is set\n'
[[ "$flagx" ]] && printf 'x flag is set, arg is "%s"\n' "$argx"
[[ "$@" ]] && {
printf 'remaining arguments:'
printf ' "%s"' "$@"
printf '\n'
}