Bash ls的内容出现在输出的中间

Bash ls的内容出现在输出的中间,bash,Bash,在echo$()中包装bash脚本调用时,我遇到了一个非常奇怪的情况。这很奇怪,我不知道要显示什么代码,所以我将描述一般情况。我有一个脚本,我们称之为“run.sh”,它有一些输出。它的格式通常非常好,带有空格和换行符 我试图将这个输出与我之前运行它一次时得到的值进行比较。为此,代码通过检查“新”值和旧值是否相同来比较这两个值,即: expression=$(./runProcess.sh "$process"); expected=$(cat UnitTests/expect-process-

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

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

expression=$(./runProcess.sh "$process");
expected=$(cat UnitTests/expect-process-$process);
if [ "$expression" == "$expected" ]; then
显然,为了得到一个“old”值来与未来的测试进行比较,我需要手工计算
$(./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。

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

old == $(./run.sh);
应该是:

if [[ "$old" == "$(./run.sh)" ]]; then
使用更多的报价

尝试:

相反。(是的,带引号)

尝试:

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

[[ "$old" == "$(./run.sh)" ]]
(分配变量
old
时,不需要引用变量或命令替换,但一般来说,每次都可以使用引号)。((见戈登·戴维森对这篇文章的精彩评论,我实际上投了更高的票,还有一些关于globs的警告和在
[…]]
中引用变量)

编辑。当你编辑完你的文章后,我发现你使用的是一个低效的
cat
。而不是:

expected=$(cat UnitTests/expect-process-$process)
请使用

expected=$(< "UnitTests/expect-process-$process")
expected=$(<“单元测试/预期过程-$process”)

是的,您应该提供确切的示例。“ls的内容”?确定没有浮动的
*
吗?是将输出存储在环境变量中,还是
旧的
还是其他什么?我很确定你是对的cdarke…你需要发布你的脚本,而不是输出=)这不是实际的比较,只是为了让你了解上下文。我将把实际代码转换到post中。是的,就是这样。Bash正在将我的输出中的一个*扩展为文件夹的内容。有了引号,它就不会这样做了!在
[[…]]
中通常不需要引号,但有时引号很重要——例如,
==
运算符将右操作数视为一种模式,如果它没有被引号引用(即
[[fred==f*d]]
为真,但
[[fred==“f*d”]
为假)。“我真的建议养成重复引用所有内容的习惯,除非有理由不这样做,而不是试图跟踪所有情况,在这些情况下不引用它们是安全的。”GordonDavisson我说的是引用变量和命令替换,我认为这很清楚,因为人们通常会忘记引用他们的变量。关于这一点,我会尽量说得更清楚,但我不会在条件构造
[…]]
或赋值中引用变量和命令替换。对不起。@gniourf\u gniourf:在大多数情况下,你可以侥幸逃脱,但这不是其中之一<代码>[[$old==$(./run.sh)]]是错误的,因为它正在进行模式匹配,而不是简单的字符串比较。例如,如果
$old
包含
17/24*d_(mu1,mu2)*d_(m1,m2)*p1.p1
,但
$(./run.sh)
的类似部分只有
17/24*p1.p1
,你的版本会认为它们是匹配的。@GordonDavisson该死的,你太对了!将编辑此帖子,非常感谢。
expected=$(cat UnitTests/expect-process-$process)
expected=$(< "UnitTests/expect-process-$process")