Câu trả lời:
Có vẻ như bash không sử dụng $ IFS để tham gia các từ được tạo. Một kỹ thuật khác là lưu trữ các từ đã tạo trong một mảng và sau đó $ IFS sẽ được phát:
Tôi sẽ sử dụng một subshell vì vậy tôi không thay đổi IFS của shell này: chọn một trong các
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Điều đó phát ra chuỗi phân tách dấu phẩy thành thiết bị xuất chuẩn. Nếu bạn muốn chụp nó:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Tôi chắc chắn có nhiều cách để thực hiện điều này. Đây là một phương pháp:
echo a{b,c,d} | sed 's/ /,/g'
Mở rộng các phần tử như bạn đã hiển thị và sau đó lặp lại chúng, thêm dấu phẩy cho tất cả trừ lần lặp đầu tiên:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Kết quả:
ab, ac, ad
Xem thay thế tham số bash .
Đây là một giải pháp chỉ bash.
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
Phần trước dấu chấm phẩy gán ab ac ad
cho biến IN
và phần thứ hai sử dụng tìm kiếm và thay thế để thay đổi tất cả các dấu cách thành dấu phẩy. Có //
nghĩa là tất cả các trận đấu, không chỉ đầu tiên.
Làm tất cả trong một khung con (dấu ngoặc đơn kèm theo) để không làm ô nhiễm không gian tên của bạn.
Điều đáng chú ý là trong nhiều bối cảnh, dấu phẩy có thể được chấp nhận trong danh sách đó. NẾU dấu phẩy có thể chấp nhận được, cách dễ nhất để xử lý thay thế là printf
:
some-command "$(printf %s, a{b,c,d} )"
(Trường hợp some-command
một lệnh chạy trên danh sách được phân tách bằng dấu phẩy và không quan tâm đến dấu phẩy.)
Trên thực tế, ngay cả khi bạn không phải có dấu phẩy bạn có thể sử dụng printf
; bạn chỉ cần xác định số lượng đối số bạn mong đợi, điều này làm cho nó trở nên vụng về hơn cho các danh sách rất dài:
some-command "$(printf %s,%s,%s a{b,c,d} )"