我有一个名为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;字符。
答案 0 :(得分:4)
如果要存储命令,最好使用函数而不是变量。如您所知,重定向在存储在变量中时不起作用(|
,;
或&
也不行。
command1() {
"./l${1}t${2}" "$3"
}
command2() {
"./l${1}t${2}" < "$3"
}
command1 "$@"
command2 "$@"
这里我定义了两个函数,这些函数使用数组$@
中的参数调用。 "$@"
将脚本的参数转发给函数。
另请注意,我在"./${1}t${2}"
和"$3"
附近加了引号。使用双引号允许这些参数包含空格。自由党引用是一种很好的防御性脚本技术。
(我强烈建议不执行eval "$command2"
。使用eval
是一个非常危险的习惯。