使用命令和选项进行输入重定向

使用命令和选项进行输入重定向

我正在尝试编写一个接受 2 个参数的脚本 - 程序名称和可选标志。

我正在尝试在输入文件上执行程序命令并将输出存储在输出文件中。

$input_file < $($program options) > output_file

我尝试了各种语法组合来实现上述行为,但我收到错误,例如:不明确的重定向、I/O 错误等。

例子:

./execute cat -n 

在程序内部,我想编写代码,以便将 cat 应用于输入文件

这些不起作用:

$(${1} ${2} names.txt) > test.out
names.txt < $($1 $2) > test.out

答案1

您误解了语法。首先,输入重定向的<符号位于文件前面,而不是后面。操作顺序并不重要。因此,语法是:

< inputfile command options > outputfile

或者

command options < inputfile > outputfile

(或其他排列)。

那么,你还有额外的$。你真正需要做的是

$program $options <$inputfile >$outputfile

您可以将${program}and替换${options}$1and $2

在这种形式下,你可以做

#!/bin/bash
<names.txt $1 $2 >test.out

如果您想要多个选项,请将其称为./execute cat -n或。./execute cat '-n -s'在这种形式中,您可以有多个选项,但必须将它们放入引号中(因为$2) 未加引号,空格会将参数扩展回多个单词。

另一种(更好的)方法就是使用

#!/bin/bash
<names.txt "$@" >test.out

现在,您可以将任意数量的参数传递到脚本中,甚至可以在参数中包含带引号的字符串,并且它们在传播到脚本中后保持在一起。现在可以了:(./execute cat -n - "bla bla.txt"以前的形式会将文件名分成两部分)。

答案2

这是一种可能的解决方案:

连接命令和选项字符串,这样我们就不必处​​理很多括号。

command="$1 $2"
$command input_file > output_file

(如果我忽略了什么,请告诉我)

相关内容