getopts를 사용하여 옵션에 두 개의 인수 제공

getopts를 사용하여 옵션에 두 개의 인수 제공

아래 코드에서는 option 을 제공할 때 r인수 getopts가 필요합니다.

while getopts ":hr::l:" opt; do
    case $opt in
        r ) echo "Run Numbers - argument = $OPTARG " ;;
        l ) echo "Latency range - argument = $OPTARG" ;;
        h ) helptext
            graceful_exit ;;
        * ) usage
            clean_up
            exit 1
    esac
done

-r하지만 옵션 뒤에 하나가 아닌 두 개의 매개변수를 전달 해야 합니다 . 찾을 수 있는 단축키가 있나요?

답변1

단일 옵션을 사용하여 두 개의 인수를 전달할 수 없습니다 getopts.

다음 대안을 권장합니다.

  1. 여러 매개변수 주위에 따옴표를 넣으세요.

    이 경우 getopts는 이를 하나의 인수로 처리하지만 나중에 분할할 수 있습니다. 모든 매개변수를 한 번에 배열에 넣을 수도 있습니다.

    #!/bin/bash  
    
    while getopts ":hr:l:" opt; do
        case $opt in
            r ) echo "Run Numbers - argument = $OPTARG "
                set -f # disable glob
                IFS=' ' # split on space characters
                array=($OPTARG) ;; # use the split+glob operator
            l ) echo "Latency range - argument = $OPTARG" ;;
            h ) helptext
                graceful_exit ;;
            * ) usage
                clean_up
                exit 1
        esac
    done
    
    echo "Number of arguments: ${#array[@]}"
    echo -n "Arguments are:"
    for i in "${array[@]}"; do
      echo -n " ${i},"
    done
    printf "\b \n"
    

    예제를 실행하세요:

    ./script -r "123 456 789"
    

    그리고 출력:

    Run Numbers - argument = 123 456 789 
    Number of arguments: 3
    Arguments are: 123, 456, 789
    
  2. 쉼표(또는 기타 선호하는 문자)를 구분 기호로 사용하세요.

    ./script -r 123,456,789
    

    위의 코드를 교체하면 됩니다 IFS=" ". IFS=,이 방법의 장점은 빈 요소를 허용한다는 것입니다. 주석 섹션에서 지적했듯이 이 솔루션은 일부 일반적인 프로그램에서 선택되었습니다 lsblk -o NAME,FSTYPE,SIZE.

  3. 여러 -r옵션 허용

    여러 개 -r이지만 각각 하나의 매개변수만 사용합니다.

    ./script -r 123 -r 456 -r 789
    

    그런 다음 매개변수가 하나씩 배열에 추가됩니다.

    array+=("$OPTARG")
    

    이것의 장점은 요소가 포함할 수 있는 문자에 제한이 없다는 것입니다. 이 도구는 awk -v var1=x -v var2=y.

관련 정보