在嵌套的shell / perl脚本中转​​义空格

时间:2009-10-21 18:23:55

标签: perl bash whitespace

我正在尝试从bash脚本中运行一个perl脚本(稍后我将更改此设计,但是现在,请耐心等待)。 bash脚本接收它将运行的参数。脚本的参数如下:

test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45"
在bash脚本中,我简单地运行传递的参数:

#!/bin/sh

$1

但是,在我的perl脚本中,-g参数只获取"Some(带引号),而不是Some Example。即使我引用它,它也因为空白而被切断。

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

4 个答案:

答案 0 :(得分:2)

要按照发布test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45"运行它,请执行以下操作:

#!/bin/bash
eval "$1"

这会导致shell解析$1参数,以便拆分单个单词并删除引号。

或者如果您希望删除引号并运行test.sh myscript.pl -g "Some Example" -n 1 -p 45,如果您将脚本更改为:

#!/bin/bash
"$@"

"$@"被所有参数$1$2等替换,与命令行中传递的数量一样多。

答案 1 :(得分:1)

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

你可能会有更多的运气:

#!/bin/sh
eval "$1"

给出:

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

请注意,只是强制shell解释引用"$1"将不起作用,因为它会尝试将第一个参数(即整个命令)视为要执行的命令的名称。您需要通过eval来获得正确的引用,然后重新解析该命令。

这种方法(显然?)危险且充满安全风险。

答案 2 :(得分:1)

我建议你在一个单独的单词中命名perl脚本,然后你可以在引用它们时引用参数,并且仍然可以轻松地提取脚本名称而不需要shell来分割单词,这是你遇到的根本问题

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

然后

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

答案 3 :(得分:0)

如果你真的必须这样做(无论出于何种原因),为什么不做呢:

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

在: test.sh

RUN = myscript.pl
echo $ $ RUN $ 1

(在$ RUN之前和$ 1之后应该有反引号)