나는 이 문제를 내가 해야 할 것보다 오랫동안 조사해왔고 getopts가 매우 혼란스러운 도구라는 것을 발견했습니다.
내가하고 싶은 일은 다음과 같습니다. $1 $2 $3 와 같은 인수를 전달할 수 있는 스크립트가 있으며 그 중 하나는 선택 사항입니다 -e email
내가 한 일은 다음과 같습니다. 물론 전혀 작동하지 않았습니다.
#!/bin/bash
if [[ $# -lt 2 ]] || [[ $# -gt 3 ]]
then
echo
echo "usage is `basename $0` argument1 argument2 {-e email}"
exit 1
fi
while getopts e: flag; do
case $flag in
e)
EMAIL=$OPTARG;
;;
?)
exit;
;;
esac
done
[[ -v $EMAIL ]] && echo "I am sending you $1 and $2!!" | mutt -s "present" $EMAIL && exit 0
echo "I am keeping $1 and $2 to myself"
물론 이 getopts 비즈니스를 무시하고 사용하지 않을 수도 있습니다. 단지 올바르게 사용하는 방법을 배우고 싶을 뿐입니다.
답변1
여러 가지 질문이 있습니다:
- 옵션을 처리하기 전에 매개변수 수를 테스트하고 있습니다. 옵션을 처리할 때까지 argv의 슬롯 수를 옵션이 차지하는지 알 수 없으므로
$#
(제안한 대로) 2와 3 사이의 값이 필요한지 또는 다른 값이 필요한지 결정할 수 없습니다. 옵션의 존재를 예측하더라도 그것이 (argv 슬롯 1개 소모) 될지 (2 슬롯 소모)-e
될지는 알 수 없습니다 . 옵션이 아닌 인수 2개를 정확히 받고 싶은 것 같으므로 해야 할 일은 정확히 2개와 같은지 확인하는 것입니다.-eemail
-e email
$#
뒤쪽에옵션이 소모되었습니다. [[ -v $EMAIL ]]
이메일은 아무 의미가 없습니다. 이는 다음과 같은 여부를 테스트합니다.값of는$EMAIL
원하는 것이 아닌 유효한 쉘 변수를 지정합니다. 이것이 바로 당신의 뜻입니다[ -n "$EMAIL" ]
getopts
옵션은 사용되지 않으며 단지 구문 분석만 됩니다. 구문 분석한 후에는 를 사용하여 건너뛰어야 합니다shift $(($OPTIND-1))
.- 스크립트를 잘못 호출했습니다. 옵션은 매개변수 앞에 오므로 사용법은 입니다
$0 [-e email] argument1 argument2
.