Como inserir dois argumentos com getopts? [duplicado]

1

Estou escrevendo um script simples. Meu script instala o ppa . O problema é que não posso adicionar dois argumentos. Eu quero escrever algo simples assim:

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

Eu tentei isso, mas não leio o segundo argumento '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
    
por davidva 21.03.2014 / 07:04

2 respostas

2

Você deve colocar dois argumentos em aspas ou aspas duplas:

% ./ppa.sh -i 'ppa:chris-lea/node.js nodejs'
received -i with ppa:chris-lea/node.js nodejs
    
por 21.03.2014 / 07:20
3

Supondo que -i signifique instalar e receba dois argumentos, provavelmente é mais fácil definir apenas o -i em seu bloco getopts e, em seguida, tratar os argumentos restantes após o processamento da opção como repositório e pacote, por exemplo

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

Ou se a ideia é pegar uma lista de PPAs e pacotes, ainda mais motivos para fazer assim, basta fazer o último bit

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
    
por 21.03.2014 / 13:52

Tags