Shell script để bỏ qua PPA nếu được cài đặt


8

Tôi muốn tạo một tập lệnh sẽ thêm PPA mới hoặc bỏ qua nếu đã được cài đặt.

Ai đó đã đăng giải pháp này cho một câu hỏi khác:

#!/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 để thêm điều kiện kho apt

Trong trường hợp của tôi, tôi muốn thêm ppa:otto-kesselgulasch/gimp-edge, nhưng tôi không chắc tôi nên thêm cái này vào đâu trong kịch bản.

Tôi đã thử add_ppa(ppa:otto-kesselgulasch/gimp-edge)nhưng tôi vẫn nhận được thông báo lỗi ( ppalà tên tập lệnh của tôi):

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

Tôi cũng đã thử với một khoảng trắng ở giữa ppa và không có ()

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

Ai đó có thể cho tôi biết tôi đang làm gì sai không?


2
Sẽ rất hữu ích khi chỉnh sửa câu hỏi của bạn để bao gồm tập lệnh của bạn, giúp dễ dàng chẩn đoán vấn đề nằm ở đâu.
Arronical

Câu trả lời:


9

Đó là hàm bash và để truyền đối số cho hàm bash, bạn không cần (). Ngoài ra, hàm thêm ppa:tiền tố vào các đối số của nó, vì vậy chỉ cần điều này sẽ làm:

add_ppa otto-kesselgulasch/gimp-edge

Ngoài ra, hàm hỗ trợ nhiều đối số, vì vậy bạn có thể chạy nó cho nhiều PPA:

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

Cho rằng bạn đã đặt chức năng trong một tập lệnh, bạn nên:

  • lấy nguồn như Zanna gợi ý để lấy hàm trong shell của bạn và gọi hàm, hoặc
  • chỉ sử dụng nội dung của hàm như tập lệnh:

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

    Và cuộc gọi kịch bản với tên ppa:

    ppa otto-kesselgulasch/gimp-edge

3
Một loại lưu ý phụ, bạn có thể thả in "$@"; for i; docác vòng lặp trên các tham số vị trí.
Kevin

6

Tôi nghĩ rằng bạn đang thực thi tệp dưới dạng tập lệnh, nhưng đó chỉ là định nghĩa hàm, vì vậy hàm này không bao giờ được gọi khi chạy.

Bạn không cần thêm bất cứ thứ gì vào đó; bạn không cần thêm PPA ở bất cứ đâu trong đó. Bạn có thể sourcetập tin và sau đó gọi hàm trong shell hiện tại:

. ppa
add_ppa otto-kesselgulasch/gimp-edge

(giả sử tệp bạn đã lưu nó được gọi ppa, nằm trong thư mục làm việc hiện tại và có cùng nội dung với ví dụ bạn đã đăng)

Bạn cũng có thể chạy nó dưới dạng một tập lệnh, nếu bạn thêm một dòng thực sự gọi hàm. Bạn có thể mã hóa PPA vào nó bằng cách thêm một dòng như thế này vào cuối:

add_ppa otto-kesselgulasch/gimp-edge

và sau đó chạy tập lệnh. Nhưng theo cách đó, bạn sẽ phải chỉnh sửa tệp mỗi lần bạn muốn thêm PPA mới ...

Thay vào đó, bạn có thể gọi hàm trên tất cả các đối số được truyền cho tập lệnh bằng cách thêm một dòng như thế này:

add_ppa "$@"

sau đó khi tập lệnh được gọi:

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

3

Có vẻ như bạn có thể đã mắc lỗi đánh máy trong tập lệnh của mình, cụ thể là theo định nghĩa của add_ppahàm.

Thông báo lỗi:

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

Cho biết add_ppa không được công nhận là hàm.

Có vẻ như bạn có thể đã sử dụng (thay thế {khi xác định hàm. Sửa lỗi này và chức năng sẽ hoạt động chính xác, mặc dù vậy nó nên được sử dụng như được chỉ ra trong câu trả lời của muru .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.