Shell脚本跳过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
    }

shell脚本有条件地添加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

谁能告诉我我在做什么错?


2
编辑问题以包含脚本将很有用,这样可以更轻松地诊断问题所在。
Arronical

Answers:


9

那是一个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

3
需要注意的是,您可以放下in "$@"; for i; do循环遍历位置参数。
凯文(Kevin)

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识别为函数。

看来,你可能使用了(代替{定义函数时。改正此错误,并且该功能应该正常运行,尽管应该按照muru的答案中的说明使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.