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 _FILENAME
variá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 printf
geralmente é 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 for
pode ser mais adequado do que listar explicitamente cada número inicial do intervalo.