在BASH中运行变量命令

时间:2013-10-02 18:41:30

标签: bash shell

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

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}

当我回显command1时,我得到了

./l5t1 input.txt

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

当我回显command2时,我得到了

./l5t1 < input.txt

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

./l5t1 '<' input.txt

当然会在我的程序中导致分段错误。

我想知道是否有一种方法可以运行命令2,使其运行完全与在echo输出中打印的字符串相同。老实说,我不知道为什么单引号甚至插在&lt;字符。

1 个答案:

答案 0 :(得分:4)

如果要存储命令,最好使用函数而不是变量。如您所知,重定向在存储在变量中时不起作用(|;&也不行。

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

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

command1 "$@"
command2 "$@"

这里我定义了两个函数,这些函数使用数组$@中的参数调用。 "$@"将脚本的参数转发给函数。

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

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