Shell-Skript zum Überspringen von PPA, falls installiert


8

Ich möchte ein Skript erstellen, das eine neue PPA hinzufügt oder überspringt, wenn es bereits installiert ist.

Jemand hat diese Lösung auf eine andere Frage gestellt:

#!/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
    }

Shell-Skript zum bedingten Hinzufügen eines passenden Repositorys

In meinem Fall möchte ich hinzufügen ppa:otto-kesselgulasch/gimp-edge, bin mir aber nicht sicher, wo ich dies im Skript hinzufügen soll.

Ich habe es versucht, add_ppa(ppa:otto-kesselgulasch/gimp-edge)aber es wird immer wieder die Fehlermeldung angezeigt ( ppalautet der Name meines Skripts):

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

Ich habe es auch mit einem Leerzeichen zwischen ppa und ohne () versucht

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

Kann mir bitte jemand sagen, was ich falsch mache?


2
Es wäre nützlich , Ihre Frage so zu bearbeiten , dass sie Ihr Skript enthält, damit Sie leichter diagnostizieren können, wo die Probleme liegen.
Arronical

Antworten:


9

Das ist eine Bash-Funktion, und um Argumente an Bash-Funktionen zu übergeben, brauchen Sie keine (). Außerdem fügt die Funktion ppa:ihren Argumenten das Präfix hinzu , sodass genau dies ausreichen würde:

add_ppa otto-kesselgulasch/gimp-edge

Darüber hinaus unterstützt die Funktion mehrere Argumente, sodass Sie sie für mehrere PPAs ausführen können:

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

Wenn Sie die Funktion in ein Skript eingefügt haben, sollten Sie entweder:

  • Quelle, wie Zanna vorschlägt, um die Funktion in Ihre Shell zu bekommen und die Funktion aufzurufen, oder
  • Verwenden Sie einfach den Inhalt der Funktion als Skript:

    #! /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

    Und das ruft das Skript mit dem ppa-Namen auf:

    ppa otto-kesselgulasch/gimp-edge

3
Eine Art Randnotiz, Sie können die fallen lassen in "$@"; for i; doSchleifen über die Positionsparameter.
Kevin

6

Ich denke, Sie führen die Datei als Skript aus, aber es ist nur eine Funktionsdefinition, sodass die Funktion beim Ausführen nie aufgerufen wird.

Sie müssen nichts hinzufügen. Sie müssen die PPA nirgendwo hinzufügen. Sie können sourcedie Datei und dann die Funktion in der aktuellen Shell aufrufen:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(Angenommen, die Datei, in der Sie sie gespeichert haben, heißt ppa, befindet sich im aktuellen Arbeitsverzeichnis und hat genau den gleichen Inhalt wie das von Ihnen veröffentlichte Beispiel.)

Sie können es auch als Skript ausführen, wenn Sie eine Zeile hinzufügen, die die Funktion tatsächlich aufruft. Sie können die PPA fest codieren, indem Sie am Ende eine Zeile wie die folgende hinzufügen:

add_ppa otto-kesselgulasch/gimp-edge

und führen Sie dann das Skript aus. Auf diese Weise müssten Sie die Datei jedes Mal bearbeiten, wenn Sie eine neue PPA hinzufügen möchten ...

Stattdessen können Sie die Funktion für alle an das Skript übergebenen Argumente aufrufen, indem Sie eine Zeile wie die folgende hinzufügen:

add_ppa "$@"

dann, wenn das Skript aufgerufen wird:

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

3

Es sieht so aus, als hätten Sie möglicherweise einen Tippfehler in Ihrem Skript gemacht, insbesondere bei der Definition der add_ppaFunktion.

Die Fehlermeldung:

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

Gibt an, dass add_ppa nicht als Funktion erkannt wird.

Es scheint, dass Sie (anstelle von {bei der Definition der Funktion verwendet haben. Korrigieren Sie diesen Fehler und die Funktion sollte korrekt funktionieren, obwohl sie wie in Murus Antwort angegeben verwendet werden sollte .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.