我正在尝试创建简单的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行:意外令牌附近的语法错误`('
答案 0 :(得分:0)
你可以使用它 command substitution
foo=$(sed 'bar' baz.txt)
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)