2017-10-11 1 views
0

bash 스크립트에서 4 가지 옵션 (각각 짧고 긴 버전 포함)을 가져와야합니다. 내가 무엇을 얻을bash 스크립트에서 Getopt 구문 분석 오류 (옵션 선언 실수)

OPTS=`getopt -l :author,icon,channel,message: -o :aicm: -- "[email protected]"` || 
exit 1 
eval set -- "$OPTS" 
while true; do 
    case "$1" in 
    -a|--author) echo "A:'$2'"; shift;; 
    -i|--icon) echo "I:'$2'"; shift 2;; 
    -m|--message) echo "M:'$2'"; shift 2;; 
    -c|--channel) echo "C:'$2'"; shift 2;; 
    --) shift; break;; 
    *) echo Error; exit 1;; 
    esac 
done 

그리고 여기에 있습니다 : :

명령을 출력

물론
C:'--' 
Error 

, 내가

docker run --rm -e SLACK_TOKEN slacker notify --channel foo 

싶습니다

다음

내가 무슨 짓을 이 출력을 얻으려면 :

C:'foo' 
+0

그래서'slacker' 누구의 코드 작업중인 명령과 위 포함되어 있습니까? 당신의 코드는'getopts'를 사용하는 것과 같이 막연하게 보입니다. 그리고 나서'while' 루프를 사용하여 코드를 다시 구현하십시오. – tripleee

+0

명확히하기 위해, 슬랙커는 제가 제작하고있는 도커 이미지 이름입니다. 여기에는 위 코드를 추출한 notify라는 bash 스크립트가 포함되어있다. 내 문제에 좀 더 집중할 수 있도록 통화 부분을 단순화해야했습니다. – RaDyUm

답변

1

귀하의 getopt 명령이 약간 펑키합니다. 여기서, 구분 기호의 일종으로 :를 사용하는 것 : 여기

-l :author,icon,channel,message: 

그리고 :

-o :aicm: 

이해가되지 않습니다. :은 옵션 정의에서 특별한 의미를 갖습니다. getopt(1) man 페이지를 찾아 보라 :

-l, --longoptions longopts

긴 (멀티 문자) 옵션이 인식 할 수 있습니다. 하나 이상의 옵션 이름을 쉼표로 으로 분리하여 한 번에 지정할 수 있습니다. 이 옵션은 두 x 이상 제공 될 수 있으며, longopts 은 누적됩니다. longopts의 각 긴 옵션 이름 뒤에 하나의 콜론 (필요한 인수가 있음을 나타 내기 위해)과 두 개의 콜론 (선택적인 인수가 있음을 나타냄)을 따라 을 붙일 수 있습니다.

짧은 옵션에 대해서도 마찬가지입니다.

그래서 모든 옵션이 인수를 가정, 당신은 작성합니다

OPTS=`getopt -l author:,icon:,channel:,message: -o a:i:c:m: -- "[email protected]"` || 
관련 문제