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 _FILENAME
variable.
#!/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 printf
es 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 for
posiblemente sea más adecuado que enumerar explícitamente todos y cada uno de los números de inicio de los intervalos.