比较bash中两个变量的内容

时间:2012-11-18 03:10:03

标签: bash diff

我在bash脚本中有变量$data和变量$file

data=$(echo "$(printf '%s\n' "${array[@]/%/$'\n\n'}")")
file=$(<scriptfile_results)

这些变量将包含文本。如何比较这两个?一种选择是使用 diff (1)实用程序,如下所示:

diff -u <(echo "$data") <(echo "$file")

这是比较两个变量内容的正确而优雅的方法吗?另外如何调用<( )技术?据我了解,每个<( )都会创建一个临时文件(命名管道)。

5 个答案:

答案 0 :(得分:79)

是的,diff <(echo "$foo") <(echo "$bar")没问题。

通过在bash manpage中搜索字符<(,您会发现这称为“流程替换”。

您不必担心创建临时文件的效率,因为临时文件实际上只是一个管道,而不是磁盘上的文件。试试这个:

$ echo <(echo foo)
/dev/fd/63

这表明临时文件实际上只是管道“文件描述符63.”虽然它出现在虚拟/dev文件系统上,但永远不会触及该磁盘。

您可能需要担心的实际效率问题是“流程替换”的“流程”部分.Bash要求另一个流程执行echo foo。在某些平台上,如Cygwin,如果频繁执行,这可能会非常慢。但是,在大多数现代平台上,fork非常快。我刚刚尝试通过运行脚本来执行1000次进程替换:

echo <(echo foo) <(echo foo) ... 997 repetitions ... <(echo foo)

在我的旧Mac笔记本电脑上耗时0.225秒,在同一台笔记本电脑上运行的Ubuntu虚拟机耗时2.3秒。除以1000次调用,这表明进程替换时间不到3毫秒 - 这与diff的运行时完全相形见绌,而且可能不需要担心任何事情!

答案 1 :(得分:5)

test "$data" = "$file" && echo the variables are the same

如果你想要详细,你也可以这样做:

if test "$data" = "$file"; then
  : variables are the same
else
  : variables are different
fi

答案 2 :(得分:3)

这对我最有用:

var1="cat dog mule pig"
var2="cat dog ant"

diff <( echo "$var1" ) <( echo "$var2" )

首先我设置var1和var2。然后我用&lt;()元素来区分输入是一个变量。

答案 3 :(得分:3)

~ cat test.sh   

#!/usr/bin/env bash

array1=(cat dog mule pig)
array2=(cat dog ant)

diff -ia --suppress-common-lines <( printf "%s\n" "${array1[@]}" ) <( printf "%s\n" "${array2[@]}" )

答案 4 :(得分:0)

使用comm

comm -23 <(echo $variableA | tr ' ' '\n' | sort) <(echo $variableB | tr ' ' '\n' | sort)