Skrypt powłoki, aby pominąć PPA, jeśli jest zainstalowany

8

Chciałbym utworzyć skrypt, który doda nowy PPA lub pominie, jeśli jest już zainstalowany.

Ktoś opublikował to rozwiązanie na inne pytanie:

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

skrypt powłoki, aby warunkowo dodać apt repository

W moim przypadku chciałbym dodać ppa:otto-kesselgulasch/gimp-edge, ale nie jestem pewien, gdzie mam to dodać w skrypcie.

Próbowałem, add_ppa(ppa:otto-kesselgulasch/gimp-edge)ale wciąż ppapojawia się komunikat o błędzie ( nazwa mojego skryptu):

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

Próbowałem również ze spacją między ppa i bez ()

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

Czy ktoś może mi powiedzieć, co robię źle, proszę?

Giovanni Caligaris
źródło
2
Przydałoby się edytować pytanie, aby uwzględnić skrypt, ułatwiając diagnozowanie problemów.
Arronical

Odpowiedzi:

9

To jest funkcja bash, a do przekazywania argumentów do funkcji bash nie potrzebujesz (). Ponadto funkcja dodaje ppa:przedrostek do swoich argumentów, więc wystarczyłoby to:

add_ppa otto-kesselgulasch/gimp-edge

Dodatkowo funkcja obsługuje wiele argumentów, więc możesz uruchomić ją dla wielu PPA:

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

Ponieważ umieściłeś tę funkcję w skrypcie, powinieneś albo:

  • źródło, jak sugeruje Zanna, aby uzyskać funkcję w powłoce i wywołać funkcję, lub
  • wystarczy użyć zawartości funkcji jako skryptu:

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

    I wywołaj skrypt o nazwie ppa:

    ppa otto-kesselgulasch/gimp-edge
muru
źródło
3
Jakby nuta boczna, możesz upuścić in "$@"; for i; dozapętla parametry pozycyjne.
Kevin
6

Myślę, że plik jest wykonywany jako skrypt, ale jest to tylko definicja funkcji, więc funkcja nigdy nie jest wywoływana po uruchomieniu.

Nie musisz niczego do niego dodawać; nie musisz dodawać PPA w dowolnym miejscu w nim. Możesz sourceplik, a następnie wywołać funkcję w bieżącej powłoce:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(zakładając, że plik, w którym został zapisany, jest wywoływany ppa, znajduje się w bieżącym katalogu roboczym i ma dokładnie taką samą treść jak w opublikowanym przykładzie)

Możesz również uruchomić go jako skrypt, jeśli dodasz wiersz, który faktycznie wywołuje funkcję. Możesz na stałe zakodować PPA, dodając na końcu taką linię:

add_ppa otto-kesselgulasch/gimp-edge

a następnie uruchom skrypt. Ale w ten sposób będziesz musiał edytować plik za każdym razem, gdy chcesz dodać nowy PPA ...

Zamiast tego możesz wywołać funkcję na wszystkich argumentach przekazanych do skryptu, dodając taką linię:

add_ppa "$@"

wtedy, gdy skrypt jest wywoływany:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
Zanna
źródło
3

Wygląda na to, że mogłeś napisać literówkę w skrypcie, szczególnie przy definicji add_ppafunkcji.

Komunikat o błędzie:

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

Wskazuje, że add_ppa nie jest rozpoznawany jako funkcja.

Wygląda na to, że użyłeś go (zamiast {podczas definiowania funkcji. Popraw ten błąd, a funkcja powinna działać poprawnie, chociaż powinna być używana zgodnie ze wskazaniami w odpowiedzi muru .

Arroniczny
źródło