Script shell per saltare PPA se installato


8

Vorrei creare uno script che aggiungerà un nuovo PPA o salti se già installato.

Qualcuno ha inviato questa soluzione a una domanda diversa:

#!/bin/bash 

add_ppa() {
      for i in "$@"; do
        grep -h "^deb.*$i" /etc/apt/sources.list.d/* > /dev/null 2>&1
        if [ $? -ne 0 ]
        then
          echo "Adding ppa:$i"
          sudo add-apt-repository -y ppa:$i
        else
          echo "ppa:$i already exists"
        fi
      done
    }

script di shell per aggiungere condizionalmente repository apt

Nel mio caso vorrei aggiungere ppa:otto-kesselgulasch/gimp-edge, ma non sono sicuro di dove dovrei aggiungere questo nello script.

Ho provato add_ppa(ppa:otto-kesselgulasch/gimp-edge)ma continuo a ricevere un errore che dice ( ppaè il nome del mio script):

ppa: 1: ppa: Syntax error: word unexpected (expecting ")")

Ho anche provato con uno spazio tra ppa e senza il ()

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected

Qualcuno può dirmi cosa sto facendo di sbagliato per favore?


2
Sarebbe utile modificare la tua domanda per includere lo script, rendendo più semplice la diagnosi di dove si trovano i problemi.
Arronical

Risposte:


9

Questa è una funzione bash, e per passare argomenti alle funzioni bash, non è necessario (). Inoltre, la funzione aggiunge il ppa:prefisso ai suoi argomenti, quindi solo questo farebbe:

add_ppa otto-kesselgulasch/gimp-edge

Inoltre, la funzione supporta più argomenti, quindi è possibile eseguirla per più PPA:

add_ppa otto-kesselgulasch/gimp-edge foo/bar a/b

Dato che hai inserito la funzione in uno script, dovresti:

  • sorgente come Zanna suggerisce di ottenere la funzione nella shell e chiamare la funzione, o
  • basta usare il contenuto della funzione come script:

    #! /bin/bash
    for i in "$@"; do
      if grep -Rq "^deb.*$i" /etc/apt/sources.list.d/*.list
      then
        echo "Adding ppa:$i"
        sudo add-apt-repository -y ppa:$i
      else
        echo "ppa:$i already exists"
      fi
    done
    

    E chiama lo script con il nome ppa:

    ppa otto-kesselgulasch/gimp-edge

3
Tipo di nota a margine, puoi rilasciare in "$@"; for i; dopassa sopra i parametri posizionali.
Kevin,

6

Penso che tu stia eseguendo il file come uno script, ma è solo una definizione di funzione, quindi la funzione non viene mai chiamata quando viene eseguita.

Non è necessario aggiungere nulla ad esso; non è necessario aggiungere il PPA da nessuna parte al suo interno. È possibile sourceil file e quindi chiamare la funzione nella shell corrente:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(supponendo che il file in cui è stato salvato sia chiamato ppa, sia nella directory di lavoro corrente e abbia esattamente lo stesso contenuto dell'esempio che hai pubblicato)

Potresti anche eseguirlo come script, se aggiungi una linea che chiama effettivamente la funzione. È possibile codificare il PPA in esso aggiungendo una riga come questa alla fine:

add_ppa otto-kesselgulasch/gimp-edge

e quindi eseguire lo script. Ma in questo modo, dovresti modificare il file ogni volta che vuoi aggiungere un nuovo PPA ...

Invece puoi chiamare la funzione su tutti gli argomenti passati allo script aggiungendo una linea come questa:

add_ppa "$@"

quindi quando viene chiamato lo script:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn

3

Sembra che tu abbia fatto un refuso nel tuo script, in particolare alla definizione della add_ppafunzione.

Il messaggio di errore:

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected

Indica che add_ppa non viene riconosciuto come funzione.

Sembra che tu abbia usato (al posto di {quando definisci la funzione. Correggere questo errore e la funzione dovrebbe funzionare correttamente, anche se dovrebbe essere usata come indicato nella risposta di Muru .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.