2011-03-04 18 views
5

これは私を数時間運転しています。bashスクリプトのスペースを使用したPerlコマンドライン引数の処理?

は、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]を、単にスクリプトに与えられたコマンドライン引数をプリントアウトします。

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

は、今私はシェルでこのスクリプトを使用したい:私は、二重引用符で単語を囲んでスクリプトをスペースで単一の引数を与えることができます

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

:例えば

スクリプト。私はこのようなシェルスクリプトを設定している:私は同じのparamsとhello.plを呼び出して、引用符をエスケープしています

#!/bin/bash 

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

echo "(command is $COMMAND)" 
$COMMAND 

。 このスクリプトを返します。$ COMMAND変数は、この時間は、それはのようにアップルパイを見たいと思っていない、まさに私は、コマンドラインからperlスクリプトをもう一度実行方法のようにコマンドをエコーし​​ていても

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

単一の引数。

どうしてですか?

答えて

0

$COMMANDの代わりにeval $COMMANDを試してください。

2

2コマンドライン引数

"apple 
pie" 

の問題が原因値としての空間を有するように設定されているIFSシェル変数とシェル拡張です。

printf '%q\n' "$IFS" # show value of IFS variable 

あなたはxargsの&のsh -c使用することができます '...コードを...' 模倣する/再度有効に通常のパラメータの解析を。

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

もう1つの選択肢は、shebang.cのように数行のCを書くことです。

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

関連する問題