比较bash中两个变量的内容



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

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

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

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

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

是的,diff <(echo "$foo") <(echo "$bar")很好。

通过在bash手册页中搜索字符<(,您可以发现这被称为"进程替换">

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

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

这表明临时文件实际上只是管道"文件描述符63"。尽管它出现在虚拟/dev文件系统上,但磁盘从未被触摸过。

这里您可能需要担心的实际效率问题是"进程替换"的"进程"部分。Bash分叉另一个进程来执行echo foo。在一些平台上,比如Cygwin,如果频繁执行,这可能会非常缓慢。然而,在大多数现代平台上,forking的速度相当快。我只是试着通过运行以下脚本一次进行1000个进程替换:

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

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

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

如果你想变得冗长,你也可以做:

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

这对我来说最有效:

var1="cat dog mule pig"
var2="cat dog ant"
diff <( echo "$var1" ) <( echo "$var2" )

首先我设置了var1和var2。然后我与<()元素,表示输入是一个变量。

~ cat test.sh   
#!/usr/bin/env bash
array1=(cat dog mule pig)
array2=(cat dog ant)
diff -ia --suppress-common-lines <( printf "%sn" "${array1[@]}" ) <( printf "%sn" "${array2[@]}" )

使用comm:

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

相关内容

  • 没有找到相关文章

最新更新