54

bashスクリプトに変数$dataと変数があります:$file

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

これらの変数にはテキストが含まれます。その2つを比較するにはどうすればよいですか?1 つのオプションは、次のようにdiff (1) ユーティリティを使用することです。

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

これは、2 つの変数の内容を比較するための正しくエレガントな方法ですか? <( )また、その技法はどのように呼ばれますか? 私が理解しているように<( )、一時ファイル(名前付きパイプ)ごとに作成されます..

4

5 に答える 5

102

はい、diff <(echo "$foo") <(echo "$bar")大丈夫です。

bash マンページで文字を検索<(すると、これが「プロセス置換」と呼ばれていることがわかります。</p>

一時ファイルは実際には単なるパイプであり、ディスク上のファイルではないため、一時ファイルの作成効率について心配する必要はありません。これを試して:

$ 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

于 2012-11-18T04:18:20.007 に答える
7
test "$data" = "$file" && echo the variables are the same

詳細にしたい場合は、次のこともできます。

if test "$data" = "$file"; then
  : variables are the same
else
  : variables are different
fi
于 2012-11-18T03:33:04.577 に答える
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[@]}" )
于 2014-10-13T12:09:30.653 に答える