me doy cuenta enesta preguntaese respondedor usó paréntesis dobles mientras que el otro usó corchetes:
if (( $(fileSize FILE1.txt) != $(fileSize FILE2.txt) )); then
...
if [ $(fileSize FILE1.txt) != $(fileSize FILE2.txt) ]; then
Nunca antes había visto paréntesis dobles y buscar en Google no ayuda. ¿Tienen exactamente el mismo significado? ¿Alguna diferencia en la portabilidad? ¿Razón para preferir uno sobre el otro?
Respuesta1
Desde la bash
página de manual:
((expression))
The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is
non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression".
[[ expression ]]
Return a status of 0 or 1 depending on the evaluation of the conditional expression expression. Expressions are composed of the
primaries described below under CONDITIONAL EXPRESSIONS. Word splitting and pathname expansion are not performed on the words
between the [[ and ]]; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process sub‐
stitution, and quote removal are performed. Conditional operators such as -f must be unquoted to be recognized as primaries.
Se utiliza (( ))
para realizar comparaciones matemáticas y bit a bit, y [[ ]]
para realizar comparaciones más abstractas (a test file attributes and perform string and arithmetic comparisons
), por ejemplo
touch test;
if [ -e test ]; then
echo test exists
else
echo test does not exist
fi