Não é possível usar a opção echo dentro do arquivo de script de shell

0

Meu sh é bash. Eu preciso de um indicador de progresso de percentil para o meu loop 0 ~ 9999 'for' ... Então eu uso essas linhas dentro do loop, mas a saída é muito estranha.

#!/bin/bash
declare -i percentile
for((i=0;i<=9999;i++))
do
        percentile=($i+1)%100
        if [ "$percentile" == 0 ];then
                echo -ne $((($i+1)/100))\%\r
        fi
done
echo -n '\n'

O que eu quero ver é a saída de '1%' e substituir essa linha por '2%' e '3%' ... mas não '1%', '2%', '3%' ... linha por linha.

Depois de executar este arquivo .sh, o que é exibido no terminal é

-ne 1%r
-ne 2%r
-ne 3%r
-ne 4%r
-ne 5%r
-ne 6%r
-ne 7%r
-ne 8%r
-ne 9%r
-ne 10%r
...

O bash simplesmente não reconheceu a opção '-ne' e o escape '\ r' para o comando 'echo', o que devo fazer para resolver este problema?

    
por Patrick 13.02.2017 / 04:48

2 respostas

1

Se você tiver que usar echo , tente com o retorno entre aspas, ou seja, '\r' , não apenas \r . A linha inteira é então:

echo -ne $((($i+1)/100))\%'\r'

E dê uma olhada em Por que o printf é melhor que o eco?

    
por 13.02.2017 / 04:56
1

Não acredito que você esteja usando bash porque os dois sinalizadores -n e -e são normalmente entendidos pelo bash ' echo utility.

Certifique-se de executar o script especificando explicitamente bash como o interpretador,

$ bash ./script.sh

ou tornando-o executável e executando-o,

$ chmod +x ./script.sh
$ ./script.sh

Suas operações aritméticas no script também estão erradas (ao calcular percentile ). bash realiza substituições aritméticas em $(( ... )) e avaliação aritmética em (( ... )) .

Veja uma implementação alternativa:

iter=70500

for(( i = 1; i <= iter; i++ )); do
    if ! (( i % (iter/100) )); then
        printf '\r%d%%' "$(( (100*i)/iter ))"
    fi
done

echo
    
por 13.02.2017 / 09:47