코드를 복사했습니다tutorialspoint의 getopt 기사다음 스크립트가 작동하도록 했습니다(약간):
##argument_script.sh
VARS=`getopt -o i::o:: --long input::,output:: -- "$@"`
eval set -- "$VARS"
# extract options and their arguments into variables.
while true ; do
case "$1" in
-i|--input)
case "$2" in
"") MAPPE='/default/input/here/' ; shift 2 ;;
*) MAPPE=$2 ; shift 2 ;;
esac ;;
-o|--output)
case "$2" in
"") OUTPUTFOLDER='/default/input/here/' ; shift 2 ;;
*) OUTPUTFOLDER=$2 ; shift 2 ;;
esac ;;
--) shift ; break ;;
esac
done
echo "${MAPPE}"
echo "${OUTPUTFOLDER}"
#do something here..
즉, 두 개의 선택적 매개변수 플래그 -i
/ --input
및 -o
/ 가 있습니다 -output
. 현재 스크립트에 문제가 있습니다.
플래그의 기본값을 재정의하려면 플래그 뒤에 공백 없이 원하는 값을 써야 합니다. 예: /c/
into -i
및 /f/
into 에 전달하려면 -o
다음과 같이 스크립트를 호출해야 합니다 bash argument_script.sh -i/c/ -o/f/
. 누락된 공백을 확인하세요. bash argument_script.sh -i /c/ -o /f/
변수를 작성하려면 기본값이 사용 MAPPE
됩니다 OUTPUTFOLDER
.
스크립트를 다시 작성할 수 있으므로 -i
/에 전달된 매개변수를 -o
공백 뒤에 작성해야 합니까?(예: bash argument_script.sh -i /c/ -o /f/
)
답변1
당신 이 설명하는 동작은 당신 의 :
.getopt
getopt
VARS=`getopt -o i:o: --long input:,output: -- "$@"`
그러나 이것은 스크립트를 작성하는 매우 매우 복잡한 방법입니다. 다음은 더 간단한 버전입니다(변수를 대문자로 사용하는 것과 같은 일부 나쁜 관행도 수정함).
#!/bin/bash
##argument_script.sh
vars=$(getopt -o i:o: --long input:,output: -- "$@")
eval set -- "$vars"
mappe='/default/input/here/'
outputFolder='/default/input/here/'
# extract options and their arguments into variables.
for opt; do
case "$opt" in
-i|--input)
mappe=$2
shift 2
;;
-o|--output)
outputFolder=$2
shift 2
;;
esac
done
echo "mappe: $mappe"
echo "out: $outputFolder"
이제 다음을 수행할 수 있습니다.
$ ./argument_script.sh -i /c/ -o /f/
mappe: /c/
out: /f/
실행하는 경우에도 이 기능이 작동한다는 점에 유의하세요 ./argument_script.sh -i/c/ -o/f/
. 이 공간은 필수는 아니지만 허용됩니다.
답변2
불행하게도 이는 예상된 동작이며 getopt(3)
이 getopt(1)
유틸리티의 기반이 되는 GNU 함수에 의해 구현됩니다. 맨페이지에서 (강조):
두 개의 콜론은 텍스트가 있는 경우 선택적 매개변수가 있는 옵션을 나타냅니다. 현재
argv
요소 내(예: 옵션 이름 자체와 동일한 단어, 예:-oarg
), 반환됨optarg
, 그렇지 않으면optarg
0으로 설정됩니다.
옵션과 인수 사이에 공백을 사용하려면(예: -o value
대신 -ovalue
) 인수를 만들어야 합니다.선택사항이 아닌:
, 사양의 옵션 문자 뒤에 단일을 사용합니다.