Làm cách nào để chuyển tiếp tham số đến lệnh khác trong tập lệnh bash?


165

Trong tập lệnh bash của tôi, tôi muốn phân tích 0, một hoặc hai tham số (tập lệnh có thể nhận ra chúng), sau đó chuyển tiếp các tham số còn lại đến một lệnh được gọi trong tập lệnh. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


239

Sử dụng shiftlệnh tích hợp để "ăn" các đối số. Sau đó gọi tiến trình con và truyền cho nó "$@"đối số để bao gồm tất cả các đối số còn lại. Lưu ý các trích dẫn, chúng nên được giữ, vì chúng làm cho việc mở rộng danh sách đối số được trích dẫn chính xác.


23
thực sự "$ @" an toàn hơn $ *
pixelbeat

1
@pixelbeat: Cảm ơn, bắt tốt. Tôi đã chỉnh sửa. @ Ukasz Lew: xem trang được liên kết trong hướng dẫn. :) Về cơ bản, nó xử lý trích dẫn tốt hơn.
thư giãn

22
$@về cơ bản coi mỗi phần tử của mảng là một chuỗi được trích dẫn - chúng được truyền qua mà không có cơ hội mở rộng. Nó cũng đảm bảo rằng mỗi được xem như một từ riêng biệt. Giải thích này cùng với một kịch bản thử nghiệm chứng minh sự khác biệt có ở đây: tldp.org/LDP/abs/html/i INTERNalvariables.html
Cascabel

2
Hãy chú ý sử dụng dấu ngoặc kép! Đọc thêm về lý do tại sao nó quan trọng ở đây: stackoverflow.com/a/4824637/4575793
Cadoiz

32

bash sử dụng lệnh shift :

ví dụ: shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 sản xuất

1
2 3

2
@ TamásZahola quan tâm giải thích?
Kyle Chadha

2
Nếu bạn chuyển tiếp các đối số như $1không trích dẫn chúng "$1", thì shell sẽ thực hiện phân tách từ, do đó, ví dụ foo barsẽ được chuyển tiếp dưới dạng foobarriêng biệt.
Tamás Zahola 17/07/18

Đọc thêm về lý do tại sao cần có gấp đôi "ở đây: stackoverflow.com/a/4824637/4575793
Cadoiz

1
Não tôi lộn xộn một vài chữ cái trong "shifttest" và do đó tôi đọc nó như một thứ khác.
Alex

21

Bash hỗ trợ các tham số tập hợp con (xem Các tập con và các chuỗi con ), vì vậy bạn có thể chọn tham số nào để xử lý / vượt qua như thế này.

  1. mở tập tin mới và chỉnh sửa nó: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. chạy nó:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. kết quả là:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
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.