Cómo evaluar una cadena concatenada que involucra matemáticas en un script bash

Cómo evaluar una cadena concatenada que involucra matemáticas en un script bash

Estoy intentando obtener estas cadenas como salida para elementos distintos de cero:

[21-40]
[41-60]
[61-80]
[81-100]

Pero el siguiente script intenta de alguna manera evaluar el contenido de la _FILENAMEvariable.

#!/bin/bash
for i in 0 21 41 61 81
do
    if (( $i > 0 ))
    then
        _FILENAME="[$i-$((i+19))]"
    else
        _FILENAME="First File"
    fi
    echo $_FILENAME
done

Estoy seguro de que me falta algo de sintaxis aquí.

Respuesta1

Utilice comillas dobles alrededor de referencias variables, como $_FILENAME. Sin comillas dobles, el shell intentará dividir el contenido de la variable en varias "palabras" y también expandirá cualquier archivo global (expresiones comodín) que encuentre. expresiones como[21-40] songlobs (este coincide con cualquier archivo llamado "2", "1" a "4" o "0"). Si tiene archivos con nombres coincidentes en el directorio actual, se imprimirá la lista de archivos en lugar de la expresión entre corchetes. Por lo tanto, todo lo que necesitas hacer es usar:

echo "$_FILENAME"

en lugar de la versión sin comillas. Por cierto, también es mejor usar minúsculas (o mayúsculas y minúsculas) para los nombres de las variables del shell, para evitar conflictos con las muchas variables mágicas que tienen un significado especial para el shell u otros programas.

Respuesta2

Gordon ha descrito correctamente los problemas con su código.en su respuesta. Te estoy dando una versión alternativa de tu código, tal como lo habría escrito:

echo 'First file'

for (( i = 20; i < 100; i += 20 )); do
    printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done

El uso printfes generalmente más seguro para generar datos variables o proporcionados por el usuario. Ver por ejemplo¿Por qué printf es mejor que echo?

Dado que los intervalos son regulares, un bucle estilo C forposiblemente sea más adecuado que enumerar explícitamente todos y cada uno de los números de inicio de los intervalos.

información relacionada