Truyền tham số dòng lệnh cho một chương trình bên trong tập lệnh shell


15

Đối với ./script.sh arg1 [arg2 arg3 ...], các đối số dòng lệnh arg1, arg2... có thể được nhận bằng $1, $2... Tuy nhiên, số lượng các đối số là KHÔNG cố định.

Trong kịch bản shell, tôi muốn chuyển các đối số bắt đầu từ arg2một chương trình,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

Làm thế nào tôi có thể làm điều đó vì có thể có một hoặc nhiều đối số?

Câu trả lời:


17

Cách thông thường sẽ là lưu một bản sao của arg1 ( "$1") và thay đổi các tham số theo một, để bạn có thể tham khảo toàn bộ danh sách như "$@"sau:

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash có một số hỗ trợ mảng tất nhiên, nhưng nó không cần thiết cho câu hỏi như được đặt ra.

Nếu thậm chí arg1 là tùy chọn, bạn sẽ kiểm tra nó như thế này:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

Là dấu ngoặc kép cần thiết khi sử dụng $@?
Lee

1
Dấu ngoặc kép với $@shell sẽ trích dẫn hai tham số (điều gì đó hay để làm nếu tham số chứa các ký tự thú vị như dấu ngoặc đơn hoặc dấu hoa thị). Nếu bạn không quan tâm đến điều đó, một $*công việc đơn giản ...
Thomas Dickey

6
@Lee Có, dấu ngoặc kép là cần thiết. Mặt khác, thay vì chuyển qua danh sách các đối số, mỗi đối số được phân chia ở khoảng trắng, sau đó mỗi phần được hiểu là một mẫu ký tự đại diện và, nếu mẫu đó khớp, nó sẽ được thay thế bằng danh sách khớp. Nói chung, nói luôn , thay thế đôi trích dẫn thay thế .
Gilles 'SO- ngừng trở nên xấu xa'

10

Bạn có thể cắt các tham số vị trí bằng cách sử dụng mở rộng tham số. Cú pháp là:

${parameter:offset:length}

Nếu lengthđược bỏ qua, nó được thực hiện cho đến giá trị cuối cùng.

Khi bạn chuyển từ đối số thứ hai sang đối số cuối cùng, bạn cần:

${@:2}

Thí dụ:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
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.