porównaj zawartość dwóch zmiennych w bash

Mam zmienną $data i zmienną $file w skrypcie bash:

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

Te zmienne będą zawierać tekst. Jak je porównać? Jedną z opcji jest użycie diff(1) takiego narzędzia:

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

Czy jest to poprawny i elegancki sposób porównywania zawartości dwóch zmiennych? Ponadto jak nazywa się technika <( )? Jak Rozumiem, dla każdego <( ) tworzony jest plik tymczasowy(o nazwie pipe)..

 33
Author: Martin, 2012-11-18

4 answers

Tak, w porządku.

Przeszukując stronę podręcznika bash W poszukiwaniu znaków <(, można stwierdzić, że nazywa się to "podstawieniem procesu."

Nie musisz się martwić o wydajność tworzenia pliku tymczasowego, ponieważ plik tymczasowy jest tak naprawdę tylko rurą, a nie plikiem na dysku. Spróbuj tego:

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

Pokazuje to, że plik tymczasowy jest tak naprawdę tylko deskryptorem pliku pipe 63."Chociaż pojawia się na wirtualnym systemie plików /dev, dysk nigdy wzruszony.

Rzeczywisty problem wydajności, który możesz potrzebować martwić się o tutaj jest' proces 'część" substytucji procesu."Bash rozwidla inny proces do wykonania echo foo. Na niektórych platformach, takich jak Cygwin, może to być bardzo powolne, jeśli wykonywane często. Jednak na większości nowoczesnych platform, forking jest dość szybki. Po prostu próbowałem zrobić 1000 podstawień procesów na raz, uruchamiając skrypt:

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

Zajęło to 0.225 s na moim starszym laptopie Mac i 2.3 sekundy w Ubuntu virtual maszyna działa na tym samym laptopie. Dzieląc przez 1000 wywołań, pokazuje to, że zastępowanie procesów zajmuje mniej niż 3 milisekundy-coś całkowicie przyćmionego przez runtime diff, i prawdopodobnie nie masz się czym martwić!

 69
Author: andrewdotn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-18 04:18:20
test "$data" = "$file" && echo the variables are the same

Jeśli chcesz być gadatliwy, możesz również zrobić:

if test "$data" = "$file"; then
  : variables are the same
else
  : variables are different
fi
 5
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-18 03:33:04

To działa najlepiej dla mnie:

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

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

Najpierw ustawiłem var1 i var2. Następnie rozróżniam elementy

 3
Author: determinacy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-10 16:26:43
~ 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[@]}" )
 3
Author: deadElk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-13 12:57:16