如果已安装,则跳过 PPA 的 Shell 脚本

如果已安装,则跳过 PPA 的 Shell 脚本

我想创建一个脚本来添加新的 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 存储库的 shell 脚本

就我而言,我想添加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 的指示使用回答

相关内容