Tôi đã dành hàng giờ trước để cố gắng viết một kịch bản bash khá đơn giản và tôi chưa bao giờ cảm thấy ngu ngốc như vậy.
Vì vậy, tôi có một danh sách các chuỗi (là các đặc tả bộ chọn gói cho trình quản lý gói, nếu có vấn đề) có thể chứa dấu hoa thị. Tôi cần xây dựng một dòng lệnh bảo quản các dấu sao đó và sau đó gọi một chương trình. Đây là nỗ lực ngây thơ của tôi:
xs="foo/bar */*"
xs_cmd=""
for x in $xs; do
xs_cmd="$xs_cmd -0 $x "
done
echo $xs_cmd
Tôi cần echo
gọi để tương đương với
echo -0 foo/bar -0 '*/*'
đầu ra nào -0 foo/bar -0 */*
.
P. S. Trong thực tế, dòng đầu tiên phức tạp hơn một chút: xs="$some foo/bar */* $(get_others)"
.
Nếu bạn chạy tập lệnh này trong một thư mục chứa a/b
, bạn sẽ nhận được -0 foo/bar -0 a/b
thay thế.
Khi tôi thay đổi dòng cuối cùng thành
echo "$xs_cmd" # note the quotes
tôi có -0 foo/bar -0 a/b
và, trước hết, đó là những gì tôi không muốn echo
với một Độc thân và hơn nữa điều đó cho tôi biết rằng việc mở rộng đang diễn ra sớm hơn, có khả năng trong for
vòng lặp.
Nhưng tôi có thể thay đổi for
dòng vì
for x in "$xs"; do # note the quotes
sẽ chỉ thực hiện vòng lặp chỉ một lần: -0 foo/bar */*
(có một -0
)
vì vậy thêm các trích dẫn đó không phải là một lựa chọn chắc chắn
Bây giờ nếu tôi trở lại tập lệnh gốc và thay thế dòng đầu tiên bằng
xs="foo/bar '*/*'" # note additional single quotes
tôi có -0 foo/bar -0 '*/*'
(trích dẫn duy nhất nên có ở đó).
Có vẻ như tôi đã thử mọi sự kết hợp của dấu ngoặc kép và dấu gạch chéo ngược của dấu sao và tôi thực sự không biết phải làm gì bây giờ.
for
vòng lặp và đầu raa/b
thay vì*/*
. Một vấn đề khác là dòng đầu tiên có phần phức tạp hơn trong thực tế; Tôi sẽ cập nhật câu hỏi trong một phút.