getopts를 사용하여 두 개의 매개변수를 입력하는 방법은 무엇입니까? [복사]

getopts를 사용하여 두 개의 매개변수를 입력하는 방법은 무엇입니까? [복사]

저는 간단한 bash 스크립트를 작성하고 있습니다. 내 스크립트 설치폴리아닐린. 문제는 두 개의 매개변수를 추가할 수 없다는 것입니다. 저는 다음과 같이 간단한 것을 쓰고 싶습니다.

./ppa.sh -i ppa:chris-lea/node.js nodejs

이것을 시도했지만 두 번째 매개변수 "nodejs"를 읽지 못했습니다...

#! /bin/sh 
# Install/add PPA or Program 

while getopts ":i:e:" option;
do
 case $option in
  i)
   echo received -i with $OPTARG
ang='sudo apt-add-repository'
   ;;
  e)
   echo received -e with $OPTARG
ang='other line'
   ;;
  :)
   echo "option -$OPTARG needs an argument"
exit
   ;;
  *)
   echo "invalid option -$OPTARG" 
exit
   ;;
 esac

# done
    if [ "`echo $OPTARG | cut -d ':' -f1`" == "ppa" ]; then
echo 'is a ppa'
    $ang $OPTARG ; sleep 2s && sudo apt-get update; clear
        sudo apt-get -y install $OPTARG2
    fi
done

답변1

설치를 의미하고 두 개의 인수가 필요하다고 가정하면 getopts 블록에 플래그를 설정한 -i다음 옵션 처리 후 나머지 인수를 저장소 및 패키지로 처리하는 것이 더 쉬울 수 있습니다.-i

while getopts ":i" option; do
    case "$option" in
    i)
        mode=install
        ;;
    esac
done

shift $((OPTIND - 1))

case "$mode" in
install)
    apt-add-repository "$1"
    apt-get update
    apt-get install "$2"
    shift 2
    ;;
esac

또는 PPA 및 패키지 목록을 얻는 것이 아이디어라면 그렇게 해야 할 더 많은 이유가 있습니다.

case "$mode" in
install)
    for arg in "$@"; do
        case "$arg" in
            ppa:*)
                apt-add-repository "$arg"
                apt-get update
                ;;
            *)
                apt-get install "$arg"
                ;;
         esac
    done
    ;;
esac

답변2

두 매개변수를 모두 따옴표나 큰따옴표로 묶어야 합니다.

% ./ppa.sh -i 'ppa:chris-lea/node.js nodejs'
received -i with ppa:chris-lea/node.js nodejs

관련 정보