다음과 같이 testShell.sh
사용되는 쉘 스크립트가 있습니다 .getopts
#!/bin/bash
while getopts ":j:e:" option; do
case "$option" in
j) MYHOSTNAME=$OPTARG ;;
e) SCRIPT_PATH=$OPTARG ;;
*) ;;
esac
done
echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"
내 테스트가 다음과 같이 실행될 때:
$ testShell.sh -jvalue1 -evalue4 -Djvalue3 -pvalue2
내가 얻는 결과는 다음과 같습니다.
j=value3
e=2
remaining=
그러나 나는 출력이 다음과 같기를 원합니다.
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
보장이 가능한가요? getopts
첫 번째 캐릭터 게시물만 보기 -
상징?-Djvalue3
이렇게 하면 -jvalue3
and -pvalue2
로 해석되지 않습니다 -e2
.
답변1
이 시도:
$ ./testShell.sh -j value1 -e value4 -D jvalue3 -p value2
j=value1
e=value4
remaining=jvalue3 -p value2
옵션과 옵션 문자열 사이의 공백에 유의하십시오.
help getopts
설명하다:
OPTSTRING contains the option letters to be recognized; if a letter
is followed by a colon, the option is expected to have an argument,
which should be separated from it by white space.
즉, 옵션과 옵션 문자열 사이에 공백이 필요합니다.
bash에 내장된 getopt가 수행할 수 있는 것 이상의 기능이 필요한 경우 /usr/bin/getopt 유틸리티는 옵션과 옵션 문자열 사이에 공백이 있거나 없는 긴 옵션과 짧은 옵션을 모두 지원합니다. 선택적 문자열 매개변수와 같은 추가 기능도 지원됩니다.
그런데 /usr/bin/getopt는 debian 및 ubuntu와 같은 파생 제품의 util-linux 패키지에서 사용할 수 있습니다. 다른 배포판이나 *nixes에 대해서는 모르지만 소스를 찾을 수 없으면 다운로드할 수 있습니다. 데비안 아카이브에서 다른 곳에서 찾으세요.
답변2
이것을 3개의 포럼에 게시하고 모든 곳에서 검색한 후... 마침내 다음을 시도했고 작동했습니다...
testShell.sh -jvalue1 -evalue4 -- -Djvalue3 -pvalue2
알아채다
--
뒤쪽에-evalue4
출력은 다음과 같습니다
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
나는 믿는다, --
묻고 getopts
, 믿는다처리 중지 옵션.