1

我正在尝试创建简单的 shell 脚本,它将识别两个文本文件的输出之间的差异。当我重定向到文件(即> a 和> b)时,我能够成功运行脚本。

我在下面尝试的是将输出重定向到变量而不是文件以避免不必要的文件创建,但我收到错误ambiguous redirect

有人可以教我如何解决这个错误吗?

    sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/msmscgateway |grep "CIMD2:" | awk '{print $1, $2}' > $a
    sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/last/msmscgatewaylast |grep "CIMD2:" |awk '{print $1, $2}'  > $b
    echo="diff $a $b"

#echo "$DIFF"

test2.sh: line 2: $b: ambiguous redirect

我也尝试过其他方式但得到不同的错误

$a=`sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/msmscgateway |grep "CIMD2:" |awk '{print $1, $2}'`
$b=`sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/last/msmscgatewaylast |grep "CIMD2:"|awk '{print $1, $2}'`
echo="diff <$a <$b"

test1.sh: line 1: =CSMSH3: command not found test1.sh: line 2: =CSMSH3: command not found

但是从 shell 提示符执行时,个别命令工作正常

"sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/msmscgateway |grep "CIMD2:" |awk '{print $1, $2}'"

也从命令提示符下尝试但在脚本中失败

diff <(sed -n '/eTopUp MU(55) 网关状态1:/,/eTopUp MU(60) 网关状态:/p' /root/scripts/msmscgateway |grep "CIMD2:" |awk '{print $1, $2 }') <(sed -n '/eTopUp MU(55) 网关状态1:/,/eTopUp MU(60) 网关状态:/p' /root/scripts/last/mscgatewaylast |grep "CIMD2:" |awk '{ print $1, $2}') 得到下面的错误 test4.sh: line 1: syntax error near unexpected token `('

4

3 回答 3

0

您的:

sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/msmscgateway |grep "CIMD2:" | awk {print $1, $2}' > $a
sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/last/msmscgatewaylast |grep "CIMD2:" |awk '{print $1, $2}'  > $b

真的应该是:

a=$(sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/msmscgateway |grep "CIMD2:" | awk '{print $1, $2}')
b=$(sed -n '/eTopUp MU(55) Gateway Status1:/,/eTopUp MU(60) Gateway Status:/p' /root/scripts/last/msmscgatewaylast |grep "CIMD2:" |awk '{print $1, $2}')

将输出放入变量中。现在它可能会抱怨,因为$a$b你的情况下,它在扩展时不会转化为任何东西。

但是,正如有人提到的,这可能不适用于diff $a $b.

于 2013-04-15T06:40:04.433 回答
0

如果您不想(至少在 Bash 中),则根本不需要变量:

diff <(echo -e "a\nb\nc") <(echo -e "a\nc\nc")

基本语法是

diff <(CMD1) <(CMD2)
于 2013-04-15T11:07:40.387 回答
0

您可以使用 命令替换来做到这一点

foo=$(sed 'bar' baz.txt)

过程替换

read foo < <(sed 'bar' baz.txt)

或使用 Bash 4.2,您可以使用 lastpipe

shopt -s lastpipe
sed 'bar' baz.txt | read foo
于 2013-04-15T06:28:36.857 回答