2011-06-24 28 views
7

Có cách nào dễ dàng để "tham gia" các đối số được chuyển đến tập lệnh không? Tôi muốn một cái gì đó tương tự như [email protected], nhưng mà vượt qua các đối số cùng một lúc.Tham gia các đối số - Không gian thoát

Ví dụ, hãy xem xét kịch bản sau đây:

$/bin/bash 

./my_program [email protected] 

Khi gọi là

./script arg1 arg2 arg3 

my_program sẽ nhận được các đối số là 3 đối số tách ra. Những gì tôi muốn, là để vượt qua tất cả các đối số như một luận, tham gia với họ - tách bằng dấu cách, một cái gì đó giống như cách gọi:

./my_program arg1\ arg2\ arg3 

Trả lời

13

Sử dụng cái này:

./my_program "$*" 
3

Tôi đã có một vấn đề tương tự ngày hôm nay và đã đưa ra mã như thế này (bao gồm cả kiểm tra sanity):

#!/bin/sh 

# sanity checks 
if [ $# -lt 2 ]; then 
    echo "USAGE : $0 PATTERN1 [[PATTERN2] [...]]"; 
    echo "EXAMPLE: $0 TODO FIXME"; 
    exit 1; 
fi 

NEEDLE=$(echo $* | sed -s "s/ /\\\|/g") 
grep $NEEDLE . -r --color=auto 

Kịch bản nhỏ này cho phép bạn tìm kiếm các từ khác nhau một cách đệ quy trong tất cả fi les bên dưới thư mục hiện tại. Bạn có thể sử dụng sed để thay thế dấu phân cách "" (dấu cách) của bạn bằng bất cứ thứ gì bạn thích. Tôi thay thế một khoảng trống bằng một đường ống thoát: "" -> "\ |" Chuỗi kết quả có thể được phân tích bằng grep.

Cách sử dụng

Tìm kiếm các thuật ngữ "TODO" và "FIXME":

./script.sh TODO FIXME 

Bạn có thể tự hỏi: Tại sao không chỉ cần gọi grep trực tiếp?

grep "TODO\|FIXME" . -r 

Câu trả lời là tôi muốn thực hiện một số xử lý hậu kỳ với kết quả trong tập lệnh nâng cao hơn. Do đó tôi cần có khả năng nén tất cả các đối số đã truyền (mẫu) thành một chuỗi đơn. Và đó là phần quan trọng ở đây.

Konrad

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