며칠 동안 검색했지만 여전히 답을 찾지 못했습니다. 당신이 나에게 올바른 방향을 알려줄 수 있기를 바랍니다.
한 줄로 호출할 수 있는 옵션이 포함된 bash 스크립트를 작성하는 방법을 알고 싶습니다. 예: script.sh -a -b -c
. 선택하지 않은 매개변수는 무시됩니다.
메뉴/옵션은 다음과 같아야 합니다.
-a description: something
-b description: something else
-c description: something different
-d description: something..
이를 수행할 수 있는 방법이 있습니까?
답변1
스위치와 매개변수를 처리하는 일반적인 방법은 getopts
함수를 사용하는 것입니다. 이는 내장 함수이며 bash
bash 매뉴얼 페이지( ) man bash
에서 이에 대한 정보를 찾을 수 있습니다.
getopts
기본적으로 어떤 매개변수가 필요한지, 매개변수가 있어야 하는지 여부를 알려주는 문자열을 선언합니다 . getopts
수많은 인수(예: -abc
등가물 -a -b -c
)와 명령줄 구문 분석을 처리 합니다 . 처리가 끝나면 getopts
나머지 명령줄을 원하는 대로 처리할 수 있습니다.
일반적인 스크립트 조각은 다음과 같습니다.
ARG_A= FLAG_B= FLAG_C=
while getopts 'a:bc' OPT # -a {argument}, -b, -c
do
case "$OPT" in
a) ARG_A="$OPTARG" ;;
b) FLAG_B=yes ;;
c) FLAG_C=yes ;;
*) echo "ERROR: the options are -a {arg}, -b, -c" >&2; exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo "Remaining command line: $*"
?
원하는 경우 명령 옵션으로 추가할 수 있습니다.좋아요메시지를 사용하세요. 블록 내에서 case
이를 인용하거나 앞에 백슬래시를 넣어야 리터럴로 처리된다는 점을 기억하십시오.
내장된 명령 없이 다른 쉘에서 실행하고 싶거나,긴 논쟁예를 들어 유틸리티 만 보는 --verbose
것이 아닙니다 . 이는 내장되어 있지 않지만 보다 복잡한 상황에서 제공되도록 작성되었습니다.-v
getopt
답변2
이 작업을 수행하기 위해 Bash 관련 기능을 사용할 필요는 없습니다.
#!/bin/sh
while true
do
case "$1" in
-a) echo Saw -a! ;;
-b) echo Saw -b! ;;
-c) echo Saw -c! ;;
-?) cat <<USAGE
usage: $0 [-a] [-b] [-c] args
You cannot currently combine options, as with -ac.
USAGE
exit 1
;;
*)
echo End of options!
break;
;;
esac
shift # toss current $1; we're done with it now
done
for p in "$@"
do
echo "Non-option argument: '$p'"
done
의 코드와 다릅니다.엠마 루오의 답변, 내 것은 이식 가능한 쉘 스크립트 코드입니다. Bourne 유형의 Unix 쉘에서 실행되며 1980년경으로 거슬러 올라갑니다.
-?
나는 핸들러가 귀하의 "메뉴" 요구 사항을 충족한다고 생각합니다 . 이 <<USAGE
구조는트레독.