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

Я хотел бы создать сценарий, который добавит новый 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
    }

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

В моем случае я хотел бы добавить 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

Кто-либо может сказать мне, что я делаю неправильно?

8
задан 28 March 2018 в 05:54

3 ответа

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

add_ppa otto-kesselgulasch/gimp-edge

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

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

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

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

    #! /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
    
9
ответ дан 23 November 2019 в 05:25

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

Вы ничего не должны добавлять к нему; Вы не должны добавлять 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
6
ответ дан 23 November 2019 в 05:25

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

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

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

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

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

3
ответ дан 23 November 2019 в 05:25

Другие вопросы по тегам:

Похожие вопросы: