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.sh

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 firstMy 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 $@$*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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.