getopt에서 받은 매개변수를 수정하는 방법은 무엇입니까?

getopt에서 받은 매개변수를 수정하는 방법은 무엇입니까?

내 스크립트에는 다음 명령이 있습니다.

set -- `getopt -q agvc:l:t:i: "$@"` 
... 

while [ -n "$1" ] 
do 
-i) TIME_GAP_BOOT=$2 
shift ;; 

... 
sleep $TIME_GAP_BOOT

호출 스크립트 사용시 -i 2오류가 발생합니다.

sleep: invalid time interval `\'2\''

내가 뭘 잘못했나요? 매개변수 형식을 올바르게 지정하는 방법은 무엇입니까?

답변1

내장된 bash를 getopts사용하는 것이 더 쉽습니다. 를 사용하고 있다면 bash대신 이것을 사용해야 합니다 getopt.

GNU는 getopt공백 및 기타 메타 문자가 포함된 인수를 처리하도록 설계되었습니다. 이를 위해 -sbash 스타일 따옴표(또는 옵션에 따라 csh 스타일 따옴표)가 포함된 결과 문자열을 생성합니다. eval따옴표 를 해석하려면 getopts.

다음 예는 getopt 배포판에서 가져온 것입니다. 나는 그것과 아무 관련이 없습니다. (컴퓨터 어딘가에 나타나야 합니다. Ubuntu 및 Debian의 경우 로 표시됩니다 /usr/share/doc/util-linux/examples/getopt-parse.bash. 몇 줄만 인용하겠습니다.

# Note that we use `"$@"' to let each command-line parameter expand to a 
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
     -n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

eval종종 눈살을 찌푸리는 예제 주석에서 지적한 인용문 너머를 살펴보는 것이 중요합니다 .

대조적으로, bash 내장은 getoptsno를 요구하며 eval기본적으로 표준 C 라이브러리 호출을 에뮬레이션합니다.

while getopts agvc:l:t:i: opt; do
  case "$opt" in
   i) TIME_GAP_BOOT=$OPTARG;;
   # ...
  esac
done

관련 정보