Script shell pour ignorer PPA s'il est installé

8

Je voudrais créer un script qui ajoutera un nouveau PPA ou sautera s'il est déjà installé.

Quelqu'un a posté cette solution à une autre question:

#!/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 shell pour ajouter conditionnellement un référentiel apt

Dans mon cas, je voudrais ajouter ppa:otto-kesselgulasch/gimp-edge, mais je ne sais pas où je suis censé ajouter cela dans le script.

J'ai essayé add_ppa(ppa:otto-kesselgulasch/gimp-edge)mais je reçois toujours une erreur disant ( ppaest le nom de mon script):

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

J'ai aussi essayé avec un espace entre ppa et sans le ()

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

Quelqu'un peut-il me dire ce que je fais mal s'il vous plaît?

Giovanni Caligaris
la source
2
Il serait utile de modifier votre question pour inclure votre script, ce qui faciliterait le diagnostic de l'emplacement des problèmes.
Arronical

Réponses:

9

C'est une fonction bash, et pour passer des arguments aux fonctions bash, vous n'avez pas besoin (). De plus, la fonction ajoute le ppa:préfixe à ses arguments, donc cela suffirait:

add_ppa otto-kesselgulasch/gimp-edge

En outre, la fonction prend en charge plusieurs arguments, vous pouvez donc l'exécuter pour plusieurs PPA:

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

Étant donné que vous avez placé la fonction dans un script, vous devez soit:

  • source comme Zanna suggère d'obtenir la fonction dans votre shell et d'appeler la fonction, ou
  • utilisez simplement le contenu de la fonction comme 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
    

    Et appelez le script avec le nom ppa:

    ppa otto-kesselgulasch/gimp-edge
muru
la source
3
Une sorte de note latérale, vous pouvez laisser tomber le in "$@"; for i; doboucle sur les paramètres de position.
Kevin
6

Je pense que vous exécutez le fichier en tant que script, mais ce n'est qu'une définition de fonction, de sorte que la fonction n'est jamais appelée lorsqu'elle est exécutée.

Vous n'avez pas besoin d'y ajouter quoi que ce soit; vous n'avez pas besoin d'ajouter le PPA n'importe où à l'intérieur. Vous pouvez sourcele fichier puis appeler la fonction dans le shell actuel:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(en supposant que le fichier dans lequel vous l'avez enregistré est appelé ppa, se trouve dans le répertoire de travail actuel et a exactement le même contenu que l'exemple que vous avez publié)

Vous pouvez également l'exécuter en tant que script si vous ajoutez une ligne qui appelle réellement la fonction. Vous pouvez coder en dur le PPA en y ajoutant une ligne comme celle-ci à la fin:

add_ppa otto-kesselgulasch/gimp-edge

puis exécutez le script. Mais de cette façon, vous devrez modifier le fichier chaque fois que vous souhaitez ajouter un nouveau PPA ...

Au lieu de cela, vous pouvez appeler la fonction sur tous les arguments passés au script en ajoutant une ligne comme celle-ci:

add_ppa "$@"

puis quand le script est appelé:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
Zanna
la source
3

Il semble que vous ayez fait une faute de frappe dans votre script, en particulier à la définition de la add_ppafonction.

Le message d'erreur:

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

Indique que add_ppa n'est pas reconnu en tant que fonction.

Il semble que vous ayez utilisé (à la place de {lors de la définition de la fonction. Corrigez cette erreur et la fonction devrait fonctionner correctement, bien qu'elle doive être utilisée comme indiqué dans la réponse de muru .

Arronical
la source