Como avaliar string concatenada envolvendo matemática no script bash

Como avaliar string concatenada envolvendo matemática no script bash

Estou tentando obter essas strings como saída para itens diferentes de zero:

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

Mas o script a seguir está de alguma forma tentando avaliar o conteúdo da _FILENAMEvariável.

#!/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

Tenho certeza de que estou faltando alguma sintaxe aqui.

Responder1

Use aspas duplas em torno de referências de variáveis, como $_FILENAME. Sem aspas duplas, o shell tentará dividir o conteúdo da variável em múltiplas "palavras" e também expandir quaisquer globs de arquivo (expressões curinga) que encontrar. expressões como[21-40] sãoglobs (este corresponde a qualquer arquivo denominado "2", "1" a "4" ou "0"). Se acontecer de você ter arquivos com qualquer nome correspondente no diretório atual, a lista de arquivos será impressa em vez da expressão entre colchetes. Assim, tudo que você precisa fazer é usar:

echo "$_FILENAME"

em vez da versão não citada. Aliás, também é melhor usar letras minúsculas (ou maiúsculas e minúsculas) para nomes de variáveis ​​do shell, para evitar conflitos com muitas variáveis ​​mágicas que têm significado especial para o shell ou outros programas.

Responder2

Gordon descreveu corretamente os problemas com seu códigoem sua resposta. Estou lhe dando uma versão alternativa do seu código, do jeito que eu o teria escrito:

echo 'First file'

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

O uso printfgeralmente é mais seguro para a saída de dados variáveis ​​ou fornecidos pelo usuário. Veja, por exemploPor que printf é melhor que echo?

Como os intervalos são regulares, um loop no estilo C forpode ser mais adequado do que listar explicitamente cada número inicial do intervalo.

informação relacionada