선택적 매개변수와 비선택적 매개변수를 올바르게 캡처하는 방법은 무엇입니까?

선택적 매개변수와 비선택적 매개변수를 올바르게 캡처하는 방법은 무엇입니까?

일부 매개변수와 일부 옵션을 허용하고 해당 매개변수를 인쇄하는 쉘 스크립트를 작성하고 싶습니다. 스크립트의 이름은 다음과 같습니다 abc.ksh. 스크립트 사용법은 다음과 같습니다.
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
이제 옵션과 인수를 사용하는 쉘 스크립트를 작성합니다.

#!/bin/ksh

# Default Values
vara=","
varb=false
varbname=""
varc=false

# Scanning inputs
while getopts :a:b:cd option
do
        case $option in
                a) vara=$OPTARG;;
                   #shift $((OPTIND-1));;
                b) varb=true
                   varbname=$OPTARG;;
                   #shift $((OPTIND-1));;
                c) varc=true;;
                   #shift $((OPTIND-1));;
                d) echo "Usage $0 \-[a|b|c|d] <filename>"
                   exit 0;;
                \?) echo "Invalid option -$OPTARG. Please run '$0 -h' for help"
                    exit 1;;
                :) echo "Option -$OPTARG requires an argument. Please run '$0 -d' for help"
                   exit 1;;
esac
done

print "Args: $* \nvara: $vara \noptfile: $varb \nvarbname: $varbname \nvarc: $varc"

올바른 입력의 예:

  • ./abc.ksh -a "sample text" "some_string"
  • ./abc.ksh "some_string" -a "sample text"
  • ./abc.ksh -asample\ text some_string
  • 등...

some_string내 스크립트에 캡처된 입력이 없습니다. 어떻게 잡을 수 있나요?

답변1

프로그램은 일반적으로 "some_string" 부분을 마지막 인수로 강제하므로 이는 .abc.ksh "some_string" -a "sample text"버그입니다. 이렇게 하면 옵션을 구문 분석한 후에도 마지막 인수(부분)의 인덱스가 유지됩니다 $OPTIND."some_string"

이것이 허용되지 않는 경우 시작 부분에서 while접두사가 아닌 인수를 확인할 수 있습니다( 를 입력하기 전에. 이렇게 하면 "some_string"시작과 끝에서 모두 제공됩니다. 중간에 필요한 경우 를 사용하지 않거나 을 getopts사용하여 수행할 수 있습니다. 두 그룹 모두 getopts첫 번째 오류가 발생하면 접두사가 없는 매개변수 때문일 수 있습니다. 이를 가져오고 새 매개변수를 getopts가져와서 자체 솔루션을 출시하세요.

답변2

선택 항목을 캡처한 후

shift $OPTIND
if [ $# -eq 1 ]; then
  some_str="$1"
else
  echo "Error: missing argument" >&2
fi

관련 정보