Tại sao $ 1 trong một hàm không in đối số đầu tiên của tập lệnh?


13

Tại sao không echo $1in $1trong tập lệnh bash đơn giản này?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
bởi vì bạn đã quên $ 1 khi gọi print_s Something. Vui lòng cố gắng bao gồm văn bản trong câu hỏi và không có trong tiêu đề.
Rui F Ribeiro

cảm ơn. Điều gì sẽ là đối số echo nếu tôi cần chèn vào tập lệnh các lệnh: print_s Something "$ 1"; print_s Something "$ 2"; và có thể nhiều hơn?
pietro letti

13
Khi tôi nhìn thấy điều này ở HNQ, tôi nghĩ rằng bạn đang in hóa đơn đô la và hy vọng sẽ đọc được một câu chuyện thú vị về cách máy in của bạn phát hiện ra rằng bạn đang in tiền giả.
đường ống

@pipe Tôi đã có điều đó xảy ra với tôi trước đây, vì một số lý do, nó từ chối in bất cứ thứ gì không chỉ là những thứ có ngăn chặn chống in.
Mã hóa

Câu trả lời:


41

Các tham số vị trí đề cập đến các đối số của tập lệnh ở cấp chính của tập lệnh, nhưng để chỉ các đối số chức năng trong thân hàm. Vì thế

print_something Something

sẽ thực sự in Something.

Nếu bạn muốn chuyển các đối số của tập lệnh cho một hàm, bạn phải thực hiện điều đó một cách rõ ràng. Sử dụng

print_something "$1"

để vượt qua đối số đầu tiên, hoặc

print_something "$@"

để vượt qua tất cả chúng, mặc dù hàm trong ví dụ chỉ sử dụng hàm đầu tiên.


1
Chuyển "$@"đến print_something, như nó hiện đang được viết, vẫn sẽ chỉ in các đối số đầu tiên.
Kusalananda

13
Nhưng vấn đề là chỉ ra làm thế nào để vượt qua tất cả các đối số, tôi đoán. Thực tế là hàm, như nó đứng, chỉ sử dụng đối số đầu tiên của nó là một chút không liên quan.
kỳ lạ

Chà, chỉ nghĩ rằng không có điểm nào để vượt qua tất cả các cuộc tranh cãi nếu chỉ có điều đầu tiên được sử dụng.
Kusalananda

14
@allo số "$*"sẽ là một chuỗi đơn (được nối với ký tự đầu tiên của $IFS) trong khi "$@"sẽ là một danh sách các yếu tố được trích dẫn riêng lẻ.
Kusalananda

5
@Kusalananda quan điểm nói với ai đó muốn truyền tham số dòng lệnh cho một hàm để sử dụng "$@", ngay cả trong trường hợp này chỉ có một tham số như vậy, là bao gồm tất cả các trường hợp như vậy. Nếu OP quyết định thêm tham số thứ hai, sẽ không có gì thay đổi trong lệnh gọi hàm. Và tất cả những người khác đọc nó sẽ học cách làm đúng để tránh phải làm lại sau này.
Monty Harder

10

Điều này là do một hàm được gọi có tập hợp các tham số vị trí riêng, độc lập với tập hợp của cha mẹ / người gọi. Thử

print_something "$1"

(và echo "$1", hoặc thậm chí tốt hơn printf '%s\n' "$1", hãy nhớ trích dẫn mở rộng tham số và echokhông thể sử dụng cho dữ liệu tùy ý).


Bạn cần phải trở nên rõ ràng hơn những gì bạn đang nói về. Trình gọi $1thường khác với chức năng $1, mặc dù chúng có thể trở nên giống nhau nếu được sử dụng như đề xuất ở trên. Nếu tôi hiểu đúng, bạn echocó thể giữ nguyên ( echo $1) khi hàm được gọi với các tham số duy nhất ( print_something $2lấy $ 1 của người gọi và "làm cho" nó $1bên trong hàm)
RudiC

6
Việc sử dụng echo $1không có ý nghĩa trừ khi bạn muốn $1được coi là một danh sách các mẫu tệp được phân tách bằng $ IFS để mở rộng. echo "$1"sẽ có ý nghĩa hơn, mặc dù sẽ không đưa ra nội dung $1cho các giá trị $1như -nene, -EE...
Stéphane Chazelas
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.