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

Gio*_*ris 8 bash ppa scripts

我想创建一个脚本来添加新的 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
    }
Run Code Online (Sandbox Code Playgroud)

shell脚本有条件地添加apt存储库

就我而言,我想添加ppa:otto-kesselgulasch/gimp-edge,但我不确定应该在脚本中的何处添加它。

我试过了,add_ppa(ppa:otto-kesselgulasch/gimp-edge)但我一直收到错误消息(ppa是我的脚本名称):

ppa: 1: ppa: Syntax error: word unexpected (expecting ")")
Run Code Online (Sandbox Code Playgroud)

我也试过在 ppa 和没有 () 之间有一个空格

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected
Run Code Online (Sandbox Code Playgroud)

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

mur*_*uru 9

这是一个 bash 函数,要将参数传递给 bash 函数,您不需要(). 此外,该函数将ppa:前缀添加到其参数中,因此只需这样做:

add_ppa otto-kesselgulasch/gimp-edge
Run Code Online (Sandbox Code Playgroud)

此外,该函数支持多个参数,因此您可以为多个 PPA 运行它:

add_ppa otto-kesselgulasch/gimp-edge foo/bar a/b
Run Code Online (Sandbox Code Playgroud)

鉴于您已将该函数放入脚本中,您应该:

  • 按照 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
    
    Run Code Online (Sandbox Code Playgroud)

    并使用 ppa 名称调用脚本:

    ppa otto-kesselgulasch/gimp-edge
    
    Run Code Online (Sandbox Code Playgroud)

  • 一种旁注,您可以删除``在“$@”``; `对于我;do` 遍历位置参数。 (3认同)

Zan*_*nna 6

我认为您正在将文件作为脚本执行,但它只是一个函数定义,因此在运行时永远不会调用该函数。

你不需要添加任何东西;您无需在其中的任何位置添加 PPA。您可以source文件,然后在当前 shell 中调用该函数:

. ppa
add_ppa otto-kesselgulasch/gimp-edge
Run Code Online (Sandbox Code Playgroud)

(假设您保存的文件名为ppa,位于当前工作目录中,并且与您发布的示例具有完全相同的内容)

如果添加实际调用该函数的行,您也可以将其作为脚本运行。您可以通过在末尾添加这样的行来将 PPA 硬编码到其中:

add_ppa otto-kesselgulasch/gimp-edge
Run Code Online (Sandbox Code Playgroud)

然后运行脚本。但是那样的话,每次你想添加一个新的 PPA 时,你都必须编辑文件......

相反,您可以通过添加如下一行来调用传递给脚本的所有参数的函数:

add_ppa "$@"
Run Code Online (Sandbox Code Playgroud)

然后当脚本被调用时:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
Run Code Online (Sandbox Code Playgroud)