我正在尝试编写一个接受 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}
为$1
and $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
(如果我忽略了什么,请告诉我)