Я хотел бы создать скрипт, который добавит новый 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
Может ли кто-нибудь сказать мне, что я делаю неправильно, пожалуйста?
Похоже, что вы, возможно, сделали опечатку в своем скрипте, особенно в определении функции add_ppa.
Сообщение об ошибке:
ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected
Указывает, что add_ppa не распознается как функция.
Кажется, что вы, возможно, использовали ( в место { при определении функции. Исправьте эту ошибку, и функция должна работать правильно, хотя ее следует использовать, как указано в ответе муру.
Это функция 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
Я думаю, что вы выполняете файл как скрипт, но это всего лишь определение функции, поэтому функция никогда не вызывается при ее запуске.
Вам не нужно ничего добавлять; вам не нужно добавлять 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
Похоже, что вы, возможно, сделали опечатку в своем скрипте, особенно в определении функции add_ppa.
Сообщение об ошибке:
ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected
Указывает, что add_ppa не распознается как функция.
Кажется, что вы, возможно, использовали ( в место { при определении функции. Исправьте эту ошибку, и функция должна работать правильно, хотя ее следует использовать, как указано в ответе муру.
Это функция 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
Я думаю, что вы выполняете файл как скрипт, но это всего лишь определение функции, поэтому функция никогда не вызывается при ее запуске.
Вам не нужно ничего добавлять; вам не нужно добавлять 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