我有一个脚本,其中包含两个多行字符串。我想知道它们是否相等。我还没有找到一种方法来比较它们,因为虽然比较很容易,但将变量的值传递给比较工具却不容易。我尝试使用管道将其输出到diff命令,但是我没有成功(我尝试的许多方法都导致“文件名太长”错误)。一个解决方法是用一些罕见的字符替换换行符,但这会遇到相同的问题。有任何想法吗?
sh
,也可以比较多行字符串。特别是没有必要使用md5sum
或另一种类似机制对字符串进行哈希处理。$ cat /tmp/multiline.sh
#!/bin/sh
foo='this
is
a
string'
bar='this
is not
the same
string'
[ "$foo" = "$foo" ] && echo SUCCESS || echo FAILURE
[ "$foo" != "$bar" ] && echo SUCCESS || echo FAILURE
$ /tmp/multiline.sh
SUCCESS
SUCCESS
[[ ... ]]
代替[ ... ]
,但它们都仍然支持多行字符串。$var = $var
和 $var != $var2
。 "SUCCESS" 表示比较(相等或不相等)行为正确。 - dimo414var=$(echo -e "this\nis \na\nstring" | md5sum)
var2=$(echo -e "this\nis not\na\nstring" | md5sum)
if [[ $var == $var2 ]] ; then echo true; else echo false; fi
${...}
无法代替$(...)
的使用。不过,你关于md5sum
是正确的。 - chepner${var}
是变量扩展,$(date)
是命令替换。 - Michael Vehrs#!/bin/sh
一起工作。如果没有这个限制,就像在问题评论中讨论的那样,普通的 diff 也可以工作。 - entonio使用bats
和bats-assert
,我采用了@dimo414的解决方案(赞同他的答案)。
@test "craft a word object" {
touch "$JSON_FILE"
entry=$(cat <<-MOT
{
"key": "bonjour",
"label": "bonjour",
"video": "video/bonjour.webm"
},
MOT
)
run add_word "bonjour"
content=$(cat $JSON_FILE)
assert_equal "$entry" "$content"
}
diff <(echo "$string1") <(echo "$string2")
。 - riteshtch#!/bin/bash
还是#!/bin/sh
? - Willbash
3.2 绝对支持进程替换,但如果作为sh
运行,则不支持。 - chepner#!/bin/bash
更改为#!/bin/sh
后,@ritesht93 的diff
命令起作用了。现在关于这个问题我应该怎么做? - entonio