Tôi có tập lệnh bash để nhận một tập hợp các tệp từ người dùng. Các tệp này đôi khi nằm trong thư mục có dấu cách trong tên của chúng. Thật không may, không giống như this question tất cả các tên tệp đều được truyền qua giao diện dòng lệnh. Giả sử các đường dẫn được trích dẫn chính xác khi chúng được người dùng truyền vào, vì vậy các khoảng trống (lưu cho các khoảng trắng được trích dẫn) là các dấu phân cách giữa các đường dẫn. Làm cách nào để chuyển tiếp các tham số này đến một chương trình con trong tập lệnh bash của tôi theo cách bảo tồn không gian được trích dẫn?bash: đi qua đường dẫn với không gian làm thông số?
Trả lời
#! /bin/bash
for fname in "[email protected]"; do
process-one-file-at-a-time "$fname"
done
Lưu ý việc sử dụng quá nhiều dấu ngoặc kép. Tất cả đều cần thiết.
Đi qua tất cả các đối số cho một chương trình khác thậm chí còn đơn giản hơn:
process-all-together "[email protected]"
Các trường hợp khó khăn là khi bạn muốn tách các đối số trong một nửa. Điều đó đòi hỏi nhiều mã hơn trong một trình bao POSIX đơn giản. Nhưng có lẽ Bash có một số tính năng đặc biệt.
"$var"
Ví dụ,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>
Bạn muốn "[email protected]"
, trong đó có cú pháp đặc biệt mở rộng [email protected]
nhưng giữ gìn màu trắng-không gian trích dẫn của người gọi (nó không tạo ra một chuỗi khổng lồ duy nhất với tất cả các đối số trong đó). Vì vậy, ai đó có thể gọi kịch bản của bạn như:
bash-script.sh AFile "Another File With Spaces"
Sau đó, trong kịch bản của bạn, bạn có thể làm những việc như:
for f in "[email protected]"; do
echo "$f";
done
và nhận được hai dòng đầu ra (không 5).
Đọc đoạn văn về Parameter đặc biệt "@" ở đây: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
Bravo @Roland. Thans rất nhiều cho giải pháp của bạn
Nó đã thực sự làm việc!
Tôi đã viết một hàm tập lệnh đơn giản mở ra một đường dẫn nhất định với nautilus.
Và Tôi vừa lồng một hàm với điều này "helper" -ví-loop vào chức năng chính:
fmp() {
fmp2() {
nautilus "[email protected]";
};
for fname in "[email protected]";
do
fmp2 "$fname";
done;
}
Bây giờ tôi có thể làm cho tất cả các kịch bản của tôi làm việc xử lý với đường dẫn chỉ bằng cách chuyển chúng thành các hàm lồng nhau được bao bọc bởi một hàm với vòng lặp trợ giúp này.
- 1. Tính số đường đi qua biểu đồ
- 2. Thông số F # đi qua
- 3. Đi qua một không gian tách biệt hệ thống tài sản thông qua một kịch bản shell không hoạt động
- 4. tham số Đi qua để điều khiển hành động thông qua các tuyến đường
- 5. Đếm số đường đi ngắn nhất thông qua một nút trong DAG
- 6. Tên đường dẫn Apache mod_rewrite làm thông số truy vấn?
- 7. Đường dẫn một chiều ngắn nhất thông qua nhiều nút
- 8. Windows API - Đường dẫn CreateProcess() với không gian
- 9. Có thể có được đường dẫn không gian làm việc trong Xcode 4 thông qua biến môi trường
- 10. thông số đi qua để apscheduler hàm điều khiển
- 11. Đi qua số, Number.prototype.format
- 12. VBS với không gian trong đường dẫn tệp
- 13. Bỏ qua mục nhập đường dẫn có hoàn thành tab bash
- 14. Tính đường đi ngắn nhất qua cửa hàng tạp hóa
- 15. Trường hợp sử dụng thông số đường dẫn URL
- 16. Hướng dẫn Robot qua đường dẫn
- 17. Bash - Đi qua lập luận bằng cách tham khảo
- 18. Làm thế nào để sử dụng cscope với đường dẫn có chứa không gian
- 19. OOP - Thông điệp đi qua trong C#
- 20. Đi qua các thông số chuyển hướng phức tạp với MvvmCross ShowViewModel
- 21. kênh chặn và thông báo không đồng bộ đi qua
- 22. Làm thế nào để vẽ một đường cong mịn đi qua một số điểm
- 23. đường ray has_many: thông qua has_many: thông qua
- 24. Đi qua lập luận để bí danh trong bash
- 25. Cách MVC4 sử dụng đường dẫn ảo đi kèm?
- 26. REST cách truyền thông số đường dẫn trống?
- 27. Đối số đi qua trong kịch bản sh
- 28. Đi qua cãi nhau với khoảng trống giữa (bash) kịch bản
- 29. Đi qua một chức năng lớp cha như mẫu thông số không typename
- 30. Xác định nhiều tuyến đường Express.js bằng cách sử dụng thông số đường dẫn
Cảm ơn; nếu tôi cần xử lý chúng hàng loạt thì sao? – fbrereto
Tôi đã cập nhật câu trả lời của mình. –
Ngoài ra, hãy đảm bảo chương trình con đúng cách trích dẫn mọi thứ, ví dụ: 'process-one-file-at-a-time() {cp" $ 1 "" backupdir/$ (tên cơ sở "$ 1") "; } ' –