Сценарій оболонки, щоб пропустити 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
    }

скрипт оболонки, щоб умовно додати схожий сховище

У своєму випадку я хотів би додати 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
Було б корисно відредагувати своє запитання, щоб включити свій сценарій, полегшивши діагностувати, де лежать проблеми.
Арронічний

Відповіді:


9

Це функція 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

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 не розпізнається як функція.

Видається, що ви, можливо, використовували його (замість {визначення функції. Виправте цю помилку, і функція повинна працювати правильно, хоча її слід використовувати, як зазначено у відповіді Муру .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.