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'
}