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