我正在尝试从bash脚本中运行一个perl脚本(稍后我将更改此设计,但是现在,请耐心等待)。 bash脚本接收它将运行的参数。脚本的参数如下:
test.sh "myscript.pl -g \"Some Example\" -n 1 -p 45"
在bash脚本中,我简单地运行传递的参数:
#!/bin/sh
$1
但是,在我的perl脚本中,-g参数只获取"Some
(带引号),而不是Some Example
。即使我引用它,它也因为空白而被切断。
我试图逃避空白,但它不起作用......任何想法?
答案 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之后应该有反引号)