我想创建一个脚本来添加新的 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
谁能告诉我我做错了什么?
答案1
这是一个 bash 函数,要将参数传递给 bash 函数,您不需要()
。此外,该函数会将ppa:
前缀添加到其参数中,因此只需这样做即可:
add_ppa otto-kesselgulasch/gimp-edge
此外,该函数支持多个参数,因此您可以为多个 PPA 运行它:
add_ppa otto-kesselgulasch/gimp-edge foo/bar a/b
假设您已将该函数放入脚本中,您应该:
- 按照 Zanna 的建议,在你的 shell 中获取该函数并调用它,或者
只需使用函数的内容作为脚本:
#! /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
答案2
我认为您正在将该文件作为脚本执行,但它只是一个函数定义,因此运行时该函数永远不会被调用。
您不需要在其中添加任何内容;您不需要在其中的任何地方添加 PPA。您可以访问source
该文件,然后在当前 shell 中调用该函数:
. 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 未被识别为一个函数。
看来您在定义函数时可能使用了(
代替{
。纠正此错误,该函数应该可以正常工作,但应按照 muru 的指示使用回答。