Подтвердить что ты не робот

Сравнить содержимое двух переменных в bash

У меня есть переменная $data и переменная $file в bash script:

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

Эти переменные будут содержать текст. Как сравнить эти два? Один из вариантов - использовать утилиту diff (1) следующим образом:

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

Это правильный и элегантный способ сравнить содержимое двух переменных? Кроме того, как называется метод <( )? Насколько я понимаю, для каждого <( ) создается временный файл (named pipe)..

4b9b3361

Ответ 1

Да, diff <(echo "$foo") <(echo "$bar") отлично.

В поисках bash manpage для символов <( вы можете обнаружить, что это называется "подстановка процесса".

Вам не нужно беспокоиться об эффективности создания временного файла, потому что временный файл - это всего лишь канал, а не файл на диске. Попробуйте следующее:

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

Это показывает, что временный файл на самом деле является только "файловым дескриптором 63". Хотя он отображается в виртуальной файловой системе /dev, диск никогда не трогается.

Актуальная проблема с эффективностью, о которой вам может понадобиться беспокоиться, - "часть процесса" замещения процесса ". Bash открывает еще один процесс для выполнения echo foo. На некоторых платформах, таких как Cygwin, это может быть очень медленным, если выполнять часто. Однако на большинстве современных платформ fork ing довольно быстро. Я просто попытался сделать 1000 подстановок процесса сразу, запустив script:

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

Это потребовало 0.225s на моем старшем ноутбуке Mac и 2,3 секунды на виртуальной машине Ubuntu, работающей на том же ноутбуке. Разделение на 1000 вызовов, это показывает, что замещения процесса занимают менее 3 миллисекунд, что полностью затмевает время выполнения diff и, вероятно, не о чем вам нужно беспокоиться!

Ответ 2

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

Если вы хотите быть подробным, вы также можете сделать:

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

Ответ 3

Это работает лучше всего для меня:

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

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

Сначала я устанавливаю var1 и var2. Затем я различаю элементы <(), чтобы сказать, что вход является переменной.

Ответ 4

~ 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[@]}" )