2011-09-23 33 views
16

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

19
#! /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.

+0

Cảm ơn; nếu tôi cần xử lý chúng hàng loạt thì sao? – fbrereto

+0

Tôi đã cập nhật câu trả lời của mình. –

+1

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") "; } ' –

0
"$var" 

Ví dụ,

$ var='foo bar' 

$ perl -E'say "<<$_>>" for @ARGV' $var 
<<foo>> 
<<bar>> 

$ perl -E'say "<<$_>>" for @ARGV' "$var" 
<<foo bar>> 
3

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

0

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.

Các vấn đề liên quan