2017-07-21 15 views
-2

我想为我的shell提供一个文件作为输入,作为回应应测试该文件是否包含特定字词并决定执行什么命令。我还没有弄清楚这个错误可能在哪里。请找到shell脚本,我写道:执行bash命令取决于关键字

#!/bin/(shell) 

input_file="$1" 

output_file="$2" 

grep "X-G303" | awk -f ./mno/script.awk $input_file > t1.json 

grep "x-g301" | sh ./mno/tm.sh $input_file > t2.json 

当我输入使用awk的一切都得到了按预期执行,但对于第二个命令我甚至不得到一个输出文件的文件。任何帮助非常感谢 干杯,

+0

您的'grep'命令没有被传递给一个文件,因此这些命令应该无限期地阻塞为'grep'进程'stdin'。另外,'|'不是一个“或”命令,它是一个将左边命令的输出发送到右边命令输入的管道,向我们展示您正在使用的实际shell可能很有用而不是'(shell)',尽管'bash'标签可能是一个很好的线索 –

+0

感谢您的注意。我纠正它,它正在工作! –

回答

1

你还没有在你的问题中指定这个,但我猜你有一个文件与关键字,例如,包含x-g301的文件cmdfile。然后运行脚本,如:

./script "input_file" "output_file" < cmdfile 

如果是这样,第一个grep命令将在stdin消耗整个cmdfile而搜索第一个模式,什么都不会留下第二grep。这就是为什么第二个grep,然后你的第二个脚本,没有输出。

有很多方法可以解决这个问题,但是选择正确的方法取决于你想要做什么,以及cmdfile的外观如何。假设这是与其他事物不仅仅是命令模式更大的文件,你可以通过该文件作为第三个参数给脚本,就像这样:

./script "input_file" "output_file" "cmdfile" 

,有你的脚本处理这样的:

#!/bin/bash 

input_file="$1" 
output_file="$2" 
cmdfile="$3" 

if grep -q "X-G303" "$cmdfile"; then 
    awk -f ./mno/script.awk "$input_file" > t1.json 
fi 

if grep -q "x-g301" "$cmdfile"; then 
    sh ./mno/tm.sh "$input_file" > t2.json 
fi 

这里我还假设你的awksh脚本并不真的需要grep的输出,因为你给他们输入文件的名字。

请注意,使用grep进行存在搜索的正确方法是通过其退出代码(以及使用-q的静音输出)。我们可以使用shortcircuiting(grep ... && awk ...)代替if,但这种方式可能更具可读性。

+0

感谢您的声明。请看看我正在尝试执行的cmdfile。 –

+0

谢谢,我注意到我没有指定源文件就执行了grep。一切都很好。 –

+0

不客气,我很高兴它的作品! – randomir