Script shell untuk melewati PPA jika diinstal

8

Saya ingin membuat skrip yang akan menambah PPA baru atau lewati jika sudah diinstal.

Seseorang memposting solusi ini ke pertanyaan lain:

#!/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 script untuk menambahkan repositori apt secara kondisional

Dalam kasus saya, saya ingin menambahkan ppa:otto-kesselgulasch/gimp-edge, tetapi saya tidak yakin di mana saya harus menambahkan ini dalam skrip.

Saya mencoba add_ppa(ppa:otto-kesselgulasch/gimp-edge)tetapi saya terus mendapatkan pesan kesalahan ( ppaadalah nama skrip saya):

ppa: 1: ppa: Syntax error: word unexpected (expecting ")")

Saya juga mencoba dengan spasi di antara ppa dan tanpa ()

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected

Adakah yang bisa memberitahu saya apa yang saya lakukan salah?

Giovanni Caligaris
sumber
2
Akan bermanfaat untuk mengedit pertanyaan Anda untuk memasukkan skrip Anda, membuatnya lebih mudah untuk mendiagnosis letak masalahnya.
Arronikal

Jawaban:

9

Itu adalah fungsi bash, dan untuk meneruskan argumen ke fungsi bash, Anda tidak perlu (). Selain itu, fungsi menambahkan ppa:awalan ke argumennya, jadi ini bisa dilakukan:

add_ppa otto-kesselgulasch/gimp-edge

Selain itu, fungsi ini mendukung beberapa argumen, sehingga Anda dapat menjalankannya untuk beberapa PPA:

add_ppa otto-kesselgulasch/gimp-edge foo/bar a/b

Karena Anda telah memasukkan fungsi dalam skrip, Anda harus:

  • sumber sebagai Zanna menyarankan untuk mendapatkan fungsi di shell Anda dan memanggil fungsi tersebut, atau
  • cukup gunakan isi fungsi sebagai skrip:

    #! /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

    Dan panggil skrip dengan nama ppa:

    ppa otto-kesselgulasch/gimp-edge
muru
sumber
3
Jenis catatan, Anda dapat menjatuhkan in "$@"; for i; doloop atas parameter posisi.
Kevin
6

Saya pikir Anda mengeksekusi file sebagai skrip, tapi itu hanya definisi fungsi, jadi fungsinya tidak pernah dipanggil saat dijalankan.

Anda tidak perlu menambahkan apa pun padanya; Anda tidak perlu menambahkan PPA di mana pun di dalamnya. Anda dapat sourcefile dan kemudian memanggil fungsi di shell saat ini:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(dengan asumsi file tempat Anda menyimpannya disebut ppa, ada di direktori kerja saat ini, dan memiliki konten yang persis sama dengan contoh yang Anda posting)

Anda juga bisa menjalankannya sebagai skrip, jika Anda menambahkan baris yang benar-benar memanggil fungsi. Anda bisa memasukkan kode PPA ke dalamnya dengan menambahkan baris seperti ini di akhir:

add_ppa otto-kesselgulasch/gimp-edge

dan kemudian jalankan skrip. Namun demikian, Anda harus mengedit file setiap kali Anda ingin menambahkan PPA baru ...

Alih-alih, Anda dapat memanggil fungsi pada semua argumen yang diteruskan ke skrip dengan menambahkan baris seperti ini:

add_ppa "$@"

maka saat skrip dipanggil:

./ppa otto-kesselgulasch/gimp-edge thing/stuff etc/andSoOn
Zanna
sumber
3

Sepertinya Anda mungkin membuat kesalahan ketik pada skrip Anda, khususnya pada definisi add_ppafungsi.

Pesan kesalahan:

ppa: 1: ppa: add_ppa: not found
ppa: 12: ppa: Syntax error: "}" unexpected

Menunjukkan bahwa add_ppa tidak dikenali sebagai fungsi.

Tampaknya Anda mungkin telah menggunakannya (untuk {mendefinisikan fungsi. Perbaiki kesalahan ini dan fungsinya harus bekerja dengan benar, meskipun harus digunakan seperti yang ditunjukkan dalam jawaban muru .

Arronikal
sumber