2013-10-02 87 views
2

我有一个名为script.sh的BASH脚本,它接受3个参数并用它们运行一个可执行文件。前两个只是数字,但最后一个是给出输入文件的参数。我希望脚本运行带有输入的可执行文件作为可执行文件的参数,并使用“<”作为stdin的替代文件。 (即在BASH中运行变量命令

bash script.sh 5 1 input.txt 

调用bash脚本,并script.sh的内容如下:

#!/bin/bash 

command1="./l${1}t${2} $3" 
command2="./l${1}t${2} < $3" 

echo + ${command1} 
${command1} 

echo + ${command2} 
${command2} 

当我回声命令1,我得到

./l5t1 input.txt 

这正是我想要和它运行得很好。

当我回显command2我得到

./l5t1 < input.txt 

这又是我想要的。问题是脚本运行的实际命令是

./l5t1 '<' input.txt 

这当然引起我的程序分段错误。

我想知道是否有一种方法可以运行命令2,以便它完全按照在echo输出中打印的那样运行字符串。老实说,我不知道为什么单引号甚至插入在<字符周围。

+1

不管怎么说,你应该能够'eval'变量的内容。 – Rubens

回答

4

如果要存储命令,最好使用函数而不是变量。正如你发现的那样,当存储在变量中时,重定向不起作用(|,;&)。

command1() { 
    "./l${1}t${2}" "$3" 
} 

command2() { 
    "./l${1}t${2}" < "$3" 
} 

command1 "[email protected]" 
command2 "[email protected]" 

在这里,我已经定义两个函数,这是所谓的与从阵列[email protected]的参数。 "[email protected]"将脚本的参数转发给函数。

另请注意,我已将报价放在"./${1}t${2}""$3"左右。使用双引号允许这些参数包含空格。自由引用是一种很好的防御性脚本技术。

(我强烈建议eval "$command2"。使用eval是一个非常危险的习惯进入。)

+0

这正是我需要的!感谢您的帮助和伟大的解释! –