Сценарий оболочки для пропуска PPA, если установлен

8

Я хотел бы создать скрипт, который будет добавлять новый PPA или пропустить, если он уже установлен.

Кто-то отправил это решение на другой вопрос:

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

скрипт оболочки для условного добавления репозитория apt

В моем случае я хотел бы добавить ppa:otto-kesselgulasch/gimp-edge, но я не уверен, где я должен добавить это в сценарий.

Я пытался, add_ppa(ppa:otto-kesselgulasch/gimp-edge)но получаю сообщение об ошибке ( ppaэто имя моего сценария):

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

Я также пробовал с пробелом между PPA и без ()

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

Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

Джованни Калигарис
источник
2
Было бы полезно отредактировать ваш вопрос, включив в него сценарий, чтобы упростить диагностику проблем.
Arronical

Ответы:

9

Это функция bash, и для передачи аргументов функциям bash вам не нужно (). Кроме того, функция добавляет ppa:префикс к своим аргументам, так что просто это будет делать:

add_ppa otto-kesselgulasch/gimp-edge

Кроме того, функция поддерживает несколько аргументов, поэтому вы можете запустить ее для нескольких PPA:

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

Учитывая, что вы поместили функцию в скрипт, вы должны либо:

  • Исходите из того, что Занна предлагает получить функцию в вашей оболочке и вызвать функцию, или
  • просто используйте содержимое функции как скрипт:

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

    И вызовите скрипт с именем ppa:

    ppa otto-kesselgulasch/gimp-edge
Мур
источник
3
Вид примечания, вы можете бросить in "$@"; for i; doзацикливается на позиционных параметрах.
Кевин
6

Я думаю, что вы выполняете файл как скрипт, но это только определение функции, поэтому функция никогда не вызывается при запуске.

Вам не нужно ничего добавлять к этому; Вам не нужно добавлять PPA где-либо внутри него. Вы можете sourceфайл и затем вызвать функцию в текущей оболочке:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(при условии, что файл, в котором вы его сохранили, называется ppa , находится в текущем рабочем каталоге и имеет точно такое же содержимое, как и пример, который вы опубликовали)

Вы также можете запустить его как скрипт, если добавите строку, которая фактически вызывает функцию. Вы можете жестко закодировать PPA в нем, добавив в конце следующую строку:

add_ppa otto-kesselgulasch/gimp-edge

и затем запустите скрипт. Но в этом случае вам придется редактировать файл каждый раз, когда вы захотите добавить новый PPA ...

Вместо этого вы можете вызвать функцию для всех аргументов, передаваемых в скрипт, добавив строку, подобную этой:

add_ppa "$@"

тогда когда скрипт вызывается:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
Занна
источник
3

Похоже, что вы могли сделать опечатку в вашем сценарии, в частности, в определении add_ppa функции.

Сообщение об ошибке:

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

Указывает, что add_ppa не распознается как функция.

Похоже, что вы могли использовать (вместо {при определении функции. Исправьте эту ошибку и функция должна работать правильно, хотя она должна быть использована , как указано в Муру в ответ .

Arronical
источник