Truyền đối số có dấu cách giữa tập lệnh (bash)


93

Tôi có hai tập lệnh bash sau đây

tro:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

Hệ nhị phân someApp nhận $*là 2 đối số ('Của tôi' và 'Đối số') thay vì 1.

Tôi đã thử nghiệm một số thứ:

  • Chỉ chạy someApp cho đến b.shkhi hoạt động như mong đợi
  • Lặp lại + lặp lại các đối số trong b.shhoạt động như mong đợi
  • Sử dụng $@thay vì $*không tạo ra sự khác biệt

6
thử someApp "$*"haysomeApp "$@"
— Russell Uhl

1
Yupp - hoạt động như một sự quyến rũ!
— John Fear

Câu trả lời:


147

$*, không được trích dẫn, mở rộng thành hai từ. Bạn cần phải trích dẫn nó để someAppnhận được một đối số duy nhất.

someApp "$*"

Có thể bạn muốn sử dụng $@thay thế, vì vậy điều đó someAppsẽ nhận được hai đối số nếu bạn gọi b.shlà

b.sh 'My first' 'My second'

Với someApp "$*", someAppsẽ nhận được một đối số duy nhất My first My second. Với someApp "$@", someAppsẽ nhận được hai đối số, My firstvà My second.


24
Có vẻ như chìa khóa dễ bỏ sót là "$ @" cần được trích dẫn. $ @ là không đủ.
— magic2k

1
@racle2k Đúng. Không được trích dẫn $@và $*hoạt động giống hệt nhau.
— chepner

2
@Matt Đó là một cái gì đó hoàn toàn khác. "$ @" đặc biệt ở chỗ nó trích dẫn từng đối số riêng biệt. Do đó, nó có thể dẫn đến nhiều hơn một đối số. "$ something" chỉ là dấu ngoặc kép xung quanh bất cứ điều gì $ cái gì đó mở rộng đến và sẽ luôn là một đối số duy nhất.
— Carlo Wood,

Câu trả lời chỉ phù hợp với tôi nếu tôi đặt IFS=$'\n'. Không biết tại sao.
— Dominic M
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.