2011-03-04 31 views
5

Điều này đã khiến tôi mất nhiều giờ trong giờ.Xử lý đối số dòng lệnh Perl với dấu cách từ tập lệnh bash?

Hãy xem xét kịch bản sau thử nghiệm trong perl: (hello.pl)

#!/usr/bin/perl 
print "----------------------------------\n"; 
$numArgs = $#ARGV + 1; 
print "thanks, you gave me $numArgs command-line arguments:\n"; 

foreach $argnum (0 .. $#ARGV) { 
    print "$ARGV[$argnum]\n"; 
} 

Ok, nó chỉ đơn giản in ra các đối số dòng lệnh cho kịch bản.

Ví dụ:

$ ./hello.pl apple pie 
---------------------------------- 
thanks, you gave me 2 command-line arguments: 
apple 
pie 

tôi có thể cung cấp cho các kịch bản một cuộc tranh luận duy nhất với một không gian bằng cách xung quanh dòng chữ với dấu ngoặc kép:

$ ./hello.pl "apple pie" 
---------------------------------- 
thanks, you gave me 1 command-line arguments: 
apple pie 

Bây giờ tôi muốn sử dụng kịch bản này trong một vỏ kịch bản. Tôi đã thiết lập tập lệnh shell như sau:

#!/bin/bash 

PARAM="apple pie" 
COMMAND="./hello.pl \"$PARAM\"" 

echo "(command is $COMMAND)" 
$COMMAND 

Tôi đang gọi hello.pl với cùng thông số và dấu trích dẫn. kịch bản này trả về:

$ ./test.sh 
(command is ./hello.pl "apple pie") 
---------------------------------- 
thanks, you gave me 2 command-line arguments: 
"apple 
pie" 

Mặc dù biến $ COMMAND vang lệnh giống hệt như cách tôi chạy kịch bản perl từ dòng lệnh lần thứ hai, lần này nó không muốn nhìn thấy chiếc bánh táo như một đối số duy nhất.

Tại sao không?

Trả lời

0

Bạn nên thử eval $COMMAND thay vì chỉ đơn giản là $COMMAND.

2

Vấn đề của 2 đối số dòng lệnh

"apple 
pie" 

là do shell mở rộng với IFS bao biến được thiết lập để có một không gian như giá trị.

Bạn có thể sử dụng xargs & sh -c '... code ...' để bắt chước/bật lại phân tích thông số thông thường.

PARAM="'apple pie'" 
printf '%s' "$PARAM" | xargs sh -c './hello.pl "[email protected]"' argv0 

Một tùy chọn khác có thể là viết một vài dòng C (như trong shebang.c)!

http://www.semicomplete.com/blog/geekery/shebang-fix.html

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