在bash变量中比较多行字符串

12

我有一个脚本,其中包含两个多行字符串。我想知道它们是否相等。我还没有找到一种方法来比较它们,因为虽然比较很容易,但将变量的值传递给比较工具却不容易。我尝试使用管道将其输出到diff命令,但是我没有成功(我尝试的许多方法都导致“文件名太长”错误)。一个解决方法是用一些罕见的字符替换换行符,但这会遇到相同的问题。有任何想法吗?


6
请尝试使用以下命令:diff <(echo "$string1") <(echo "$string2") - riteshtch
2
我有一个包含两个多行字符串的脚本。你介意贴出这个脚本吗? - sjsam
2
你使用的是 #!/bin/bash 还是 #!/bin/sh - Will
1
bash 3.2 绝对支持进程替换,但如果作为 sh 运行,则不支持。 - chepner
1
@Will 和 @chepner,你们说得对。将 #!/bin/bash 更改为 #!/bin/sh 后,@ritesht93 的 diff 命令起作用了。现在关于这个问题我应该怎么做? - entonio
显示剩余4条评论
3个回答

7
即使您使用的是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

在中,你可以(而且通常应该)使用[[ ... ]]代替[ ... ],但它们都仍然支持多行字符串。

但是嘿!在这里,等于和不等于比较都返回相同的“SUCCESS”。我想肯定有什么问题。 - saulius2
1
@saulius2 他们正在比较不同的值 - $var = $var$var != $var2。 "SUCCESS" 表示比较(相等或不相等)行为正确。 - dimo414
谢谢!我错过了第一行中省略的“2”。 - saulius2

6
这可能会有所帮助:
var=$(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

3
  1. 你最好使用${}而不是$()。
  2. 你不需要使用md5sum...你可以直接比较字符串 "as is"。
- I-V
1
@I-V ${...}无法代替$(...)的使用。不过,你关于md5sum是正确的。 - chepner
为什么不用{}?(我真的很想了解:)) - I-V
1
@I-V ${var} 是变量扩展,$(date) 是命令替换。 - Michael Vehrs
是的,这可能可以直接完成。然而,OP提到了将多行字符串传递给比较的问题。那个问题具体是什么? - Michael Vehrs
我接受这个答案,因为它似乎可以与 #!/bin/sh 一起工作。如果没有这个限制,就像在问题评论中讨论的那样,普通的 diff 也可以工作。 - entonio

4

使用batsbats-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"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接