2

在 echo $() 中包装 bash 脚本调用时,我遇到了一个非常奇怪的情况。这很奇怪,我不知道要呈现什么代码,所以我将描述一般情况。我有一个脚本,我们称之为“run.sh”,它有一些输出。这通常格式化得很好,带有空格和换行符。

我正在尝试将此输出与我之前运行一次时得到的值进行比较。为此,代码通过检查这两个值是否相同,将“新”值与旧值进行比较,即:

expression=$(./runProcess.sh "$process");
expected=$(cat UnitTests/expect-process-$process);
if [ "$expression" == "$expected" ]; then

显然,要获得“旧”值以与我需要$(./runProcess.sh)手动计算的未来测试进行比较。当我这样做时,我会得到一个空白明显更少的输出版本。然而它显然是错误的,因为它的内容ls出现在它的中间。我的意思是我得到以下类型的运行这两个命令的输出:

./runProcess.sh g,g:

R2With2Gluons =

    + ncol*i_*pi_^2*A*g^2 * (
       - 17/24*d_(mu1,mu2)*d_(m1,m2)*p1.p1
       - 31/8*d_(mu1,mu2)*d_(m1,m2)*p1.p2
       - 17/24*d_(mu1,mu2)*d_(m1,m2)*p2.p2
       + 7/12*d_(m1,m2)*p1(mu1)*p1(mu2)
       + 1/24*d_(m1,m2)*p1(mu1)*p2(mu2)
       + 89/24*d_(m1,m2)*p1(mu2)*p2(mu1)
       + 7/12*d_(m1,m2)*p2(mu1)*p2(mu2)
       );

 0.01 sec out of 0.01 sec


echo $(./runProcess.sh g,g):
R2With3Gluons = + coeff(m1,m2,m3)*ncol*pi_^2*A*g^3 Auto Diagrams UnitTests colourCalc.frm form.set functions.frm output.frm process.frm process.mid qgraf2form.frm qgrafProcessor.py runProcess.sh runProcesses.sh test vertices.frm ( + 35/24*d_(mu1,mu2)*p1(mu3) - 35/24*d_(mu1,mu2)*p2(mu3) - 35/24*d_(mu1,mu3)*p1(mu2) + 35/24*d_(mu1,mu3)*p3(mu2) + 35/24*d_(mu2,mu3)*p2(mu1) - 35/24*d_(mu2,mu3)*p3(mu1) ); 0.40 sec out of 0.40 sec

这是ls:

ls:
Auto              form.set          process.mid       runProcesses.sh
Diagrams          functions.frm     qgraf2form.frm    test
UnitTests         output.frm        qgrafProcessor.py vertices.frm
colourCalc.frm    process.frm       runProcess.sh

如有必要,我可以提供确切的例子,但我希望这足以说明问题。为什么这可能会发生?我在 OS X Mountain Lion 上使用 bash。

4

2 回答 2

1

使用更多报价!!!

尝试:

echo "$(./run.sh)"

反而。(是的,带引号)。

尝试:

old=$(./run.sh)
echo "$old"

您将获得正确的输出(带$old引号)。现在,关于您的测试,按照 sampson-chen 的建议使用:

[[ "$old" == "$(./run.sh)" ]]

(分配变量时不需要引用变量或命令替换old,但是,作为一般规则,您可以每次都使用引号)。((请参阅 Gordon Davisson 对这篇文章的出色评论,我实际上已经投了赞成票,其中有一些关于 glob 和引用变量的警告[[ ... ]]))。

编辑。当您编辑帖子时,我发现您使用的是低效的cat. 代替:

expected=$(cat UnitTests/expect-process-$process)

请用

expected=$(< "UnitTests/expect-process-$process")
于 2012-11-30T17:28:37.903 回答
1

没有你的确切脚本很难说,但对于初学者来说,你的比较:

old == $(./run.sh);

应该:

if [[ "$old" == "$(./run.sh)" ]]; then
于 2012-11-30T17:21:43.350 回答