una - variables de entorno linux bash
comparar el contenido de dos variables en bash (4)
Tengo un $file
variable $data
y variable $file
en un script bash:
data=$(echo "$(printf ''%s/n'' "${array[@]/%/$''/n/n''}")")
file=$(<scriptfile_results)
Esas variables contendrán texto. ¿Cómo comparar esos dos? Una opción es usar la utilidad diff (1) como esta:
diff -u <(echo "$data") <(echo "$file")
¿Es esta una manera correcta y elegante de comparar el contenido de dos variables? Además, ¿cómo se llama la técnica <( )
? Según tengo entendido, para cada <( )
) se crea un archivo temporal (named pipe).
Esto funciona mejor para mí:
~ 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[@]}" )
Primero configuro var1 y var2. Luego difiero con los elementos <() para decir que la entrada es una variable.
Sí, diff <(echo "$foo") <(echo "$bar")
está bien.
Al buscar en la página de manual de bash los caracteres <(
, puede encontrar que esto se llama "sustitución de proceso".
No necesita preocuparse por la eficiencia de crear un archivo temporal, porque el archivo temporal es realmente solo un conducto, no un archivo en el disco. Prueba esto:
$ echo <(echo foo)
/dev/fd/63
Esto muestra que el archivo temporal es realmente solo el "descriptor de archivo 63" del conducto. Aunque aparece en el sistema de archivos virtual /dev
, el disco nunca se toca.
El problema real de la eficiencia que puede que tenga que preocuparse aquí es la parte del ''proceso'' de la "sustitución del proceso". Bash bifurca otro proceso para realizar el echo foo
. En algunas plataformas, como Cygwin, esto puede ser muy lento si se realiza con frecuencia. Sin embargo, en la mayoría de las plataformas modernas, la fork
es bastante rápida. Simplemente intenté hacer 1000 sustituciones de procesos a la vez ejecutando el script:
echo <(echo foo) <(echo foo) ... 997 repetitions ... <(echo foo)
Tomó 0.225s en mi computadora portátil Mac anterior, y 2.3 segundos en una máquina virtual Ubuntu que se ejecuta en la misma computadora portátil. Dividiendo por las 1000 invocaciones, esto muestra que las sustituciones de procesos tardan menos de 3 milisegundos, algo totalmente eclipsado por el tiempo de ejecución de diff
, ¡y probablemente no por algo de lo que deba preocuparse!
test "$data" = "$file" && echo the variables are the same
Si desea ser detallado, también puede hacer:
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" )