Сценарий оболочки для пропуска 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 }

сценарий оболочки для условного добавления репозитория 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

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

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

6 ответов

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

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

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

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

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

3
ответ дан 17 July 2018 в 17:56

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

add_ppa otto-kesselgulasch/gimp-edge

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

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
ответ дан 17 July 2018 в 17:56

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

Вам не нужно ничего добавлять; вам не нужно добавлять 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
ответ дан 17 July 2018 в 17:56

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

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

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

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

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

3
ответ дан 23 July 2018 в 18:48

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

add_ppa otto-kesselgulasch/gimp-edge

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

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 July 2018 в 18:48
  • 1
    Вид побочной заметки, вы можете сбросить in "$@"; for i; do пересекает позиционные параметры. – Kevin 29 March 2018 в 00:37

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

Вам не нужно ничего добавлять; вам не нужно добавлять 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 July 2018 в 18:48

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

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