2

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

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 输出中打印的方式运行字符串。老实说,我不知道为什么在 < 字符周围还要插入单引号。

4

1 回答 1

4

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

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

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

command1 "$@"
command2 "$@"

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

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

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

于 2013-10-02T19:01:26.437 回答