2009-10-21 70 views
2

我想从一个bash脚本中运行一个perl脚本(稍后我会改变这个设计,但现在,请耐心等待)。 bash脚本收到它将运行的参数。给脚本的参数如下:转义嵌套shell/perl脚本中的空白

test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45" 

的bash脚本中,我简单的运行已传递参数:

#!/bin/sh 

$1 

然而,在我的perl脚本的-g参数只得到"Some (这是与报价),而不是Some Example。即使我引用它,也会因为空白而切断。

我试图逃避空白,但它不工作......任何想法?

回答

2

要运行它张贴test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45"做到这一点:

#!/bin/bash 
eval "$1" 

这将导致$1参数由shell解析所以个人的话会被分解和去除的报价。

或者,如果你愿意,你可以删除引号和运行test.sh myscript.pl -g "Some Example" -n 1 -p 45,如果你改变了你的脚本:

#!/bin/bash 
"[email protected]" 

"[email protected]"得到由所有参数$1$2等,多达获得通过更换在命令行中。

+0

他只传一个参数到脚本,所以这应该产生: “test.sh:2号线:myscript.pl -g \” 一些示例\” - n 1 -p 45:找不到命令“。 – 2009-10-21 18:33:28

+0

是的,就像我说的第二个作品,只有当他删除引号。 – 2009-10-21 18:37:09

+0

eval为我做了。可笑的简单解决方案,我可能会添加...谢谢。 – EDJ 2009-10-21 18:42:26

1

引用通常由解析器处理,当您在脚本中替换值$1时,解析器看不到它们。

你可能有更多的运气:

#!/bin/sh 
eval "$1" 

这给:

$ sh test.sh 'perl -le "for (@ARGV) { print; }" "hello world" bye' 
hello world 
bye 

注意,只是迫使外壳解释与"$1"的报价将无法正常工作,因为那时它试图治疗第一个参数(即整个命令)作为要执行的命令的名称。您需要通过eval才能正确引用并重新解析命令。

这种方法显然是危险的,充满安全隐患。

0

如果你真的要做到这一点(不管出于什么原因),为什么不只是做:

SH test.sh “ '一些示例' -n 1 -p 45”

: 测试。 sh

RUN = myscript。PL
回声`$ RUN $ 1

(应该有$运行之前反引号`后$ 1)

1

我建议你命名的Perl脚本,在一个单独的词,那么你就可以报价参数时引用它们,并且仍然可以轻松地提取脚本名称而不需要shell来分割单词,这是您拥有的基本问题。

test.sh myscript.pl "-g \"Some Example\" -n 1 -p 45" 

然后

#!/bin/sh 
$1 "$2"