다음과 같이 작동하도록 스크립트를 얻으려고합니다.
./script -ab
이런 옵션을 전달하고 싶습니다../script -a -b
- 다음과 같은 논리를 갖습니다: "a & b -> c", "a & c -> c", "b & c -> c" (단일 옵션이 제대로 작동함)
- 또한 스크립트가 옵션 없이 호출될 때 스크립트가 함수(예: 도우미 함수)로 대체되기를 원합니다.
여기 몇 가지 예가 있어요.
#!/usr/bin/env bash
if [[ ${#} -eq 0 ]]; then
echo "Default function"
else
while getopts ":a:b:c:" opt; do
case ${opt} in
a) echo "a" ;;
b) echo "b" ;;
c) echo "c" ;;
*) echo -e "Invalid option: ${@}" ;;
esac
done
fi
도움을 주시면 감사하겠습니다.
답변1
가장 간단한 접근 방식은 아마도 각 옵션에 대한 플래그를 설정한 다음 루프 후에 A와 B의 플래그가 모두 설정되었는지 확인하고 그렇다면 C를 활성화하는 것입니다.
그러나 이를 비트맵으로 모델링할 수 있습니다. 여기서 A와 B는 각각 1비트이고 C는 두 비트가 모두 설정된 상태입니다. 따라서 A=01, B=10, C=11에 두 비트가 모두 지워진 기본 상태를 더한 것입니다. (이러한 상태는 10진수 또는 16진수 기본값 = 0, A=1, B=2, C=3에 해당합니다.) 그런 다음 해당 옵션이 표시되면 적절한 비트를 설정하기만 하면 됩니다.
이와 같이:
#!/usr/bin/env bash
mode=0
while getopts "abc" opt; do
case ${opt} in
a) mode=$(( mode | 0x01 )) ;; # set rightmost bit
b) mode=$(( mode | 0x02 )) ;; # set leftmost bit
c) mode=$(( mode | 0x03 )) ;; # set both bits
*) exit 1 ;;
esac
done
echo "chosen mode is $mode (0 = default, 1 = a, 2 = b, 3 = c)"
텍스트에 and 를 언급했지만 -A
스크립트에는 and가 있습니다. 대소문자에 신경을 써서 동일하지 않습니다. 또한 콜론은 옵션이 인수를 허용함을 표시하지만 필요하지 않은 것 같습니다.-b
a
b
getopts
getopts a:b:c:
답변2
(문제의 새로운 요청을 처리하기 위해 편집됨)
당신은 매우 가깝습니다. 내가 한 일은 다음과 같습니다. 처음에는 다소 복잡해 보이지만 기본값을 설정하고, 명령줄을 구문 분석하고, 잘못된 옵션 값이나 조합을 확인한 다음 기본 루틴을 스크립팅하는 일련의 단계입니다.
#!/usr/bin/env bash
# defaults for options
help=n
opt_a=1
opt_b=production
opt_c=0
# if no options from my user, print help message only
if [[ $# -lt 1 ]]; then help=y; fi
# parse command line
while getopts ':ha:b:c' OPTION; do
case "${OPTION}" in
h) help=y ;;
a) opt_a="${OPTARG}" ;;
b) opt_b="${OPTARG}" ;;
c) opt_c=1 ;;
\?) echo "$0: Error: Invalid option: -${OPTARG}" >&2 ; exit 1 ;;
:) echo "$0: Error: option -${OPTARG} requires an argument" >&2 ; exit 1 ;;
esac
done
shift $((OPTIND - 1))
# request for help overrides other actions
if [[ ${help} == 'y' ]]; then
# put code here to print a USAGE message
exit 0
fi
# check and error out on bad options from my user
# check -b:
case "$opt_b" in
production) ;;
staging) ;;
qa) ;;
*) echo "$0: Error: unknown argument -b \"${opt_b}\", exiting" >&2 ; exit 1 ;;
esac
# script does its work starting from here
호출하면 예상대로 script-name -c -b qa
옵션 합계가 해결 되고 -b
작동합니다.-c
script-name -cb qa
나는 옵션을 확인하는 예만 제시했습니다(대답을 단순하게 유지하기 위해). 일반적으로 각 옵션을 확인하고 합법적인 옵션 조합과 불법적인 옵션 조합에 응답하는 코드가 더 많습니다. 나는 일반적으로 이러한 코드 줄을 서브루틴에 넣어 스크립트의 기본 작업 흐름 중간에 있지 않도록 합니다.