내 스크립트에는 다음 명령이 있습니다.
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
공백 및 기타 메타 문자가 포함된 인수를 처리하도록 설계되었습니다. 이를 위해 -s
bash 스타일 따옴표(또는 옵션에 따라 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 내장은 getopts
no를 요구하며 eval
기본적으로 표준 C 라이브러리 호출을 에뮬레이션합니다.
while getopts agvc:l:t:i: opt; do
case "$opt" in
i) TIME_GAP_BOOT=$OPTARG;;
# ...
esac
done