shell脚本模糊重定向

时间:2013-04-15 06:25:58

标签: shell redirect ambiguous

我正在尝试创建简单的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&lt;(sed -n'/ eTopUp MU(55)网关状态1:/,/ eTopUp MU(60)网关状态:/ p'/ root / scripts / msmscgateway | grep“CIMD2:”| awk'{打印$ 1,$ 2}')&lt;(sed -n'/ eTopUp MU(55)网关状态1:/,/ eTopUp MU(60)网关状态:/ p'/ root / scripts / last / msmscgatewaylast | grep“CIMD2: “| awk'{print $ 1,$ 2}')得到以下错误test4.sh:第1行:意外令牌附近的语法错误`('

3 个答案:

答案 0 :(得分:0)

你可以使用它 command substitution

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

process substitution

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

或使用Bash 4.2即可 lastpipe

shopt -s lastpipe
sed 'bar' baz.txt | read foo

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

基本语法是

diff <(CMD1) <(CMD2)