Невозможно использовать параметр echo в файле сценария оболочки

Мой ш-баш. Мне нужен индикатор прогресса процентиля для моего цикла 0 ~ 9999 'для'. Поэтому я использую эти строки в цикле, но вывод очень странный.

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

Я хочу видеть, что он выводит «1%», а затем заменяет эту строку «2%» и «3%» … но не «1%», «2%», «3%», … построчно.

После выполнения этого .sh-файла то, что отображается на терминале,

 -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 ... 

Баш просто не распознал параметр «-ne» и escape-команду «\ r» для команды «эхо», что я должен сделать, чтобы решить эту проблему?

Если вам нужно использовать echo , попробуйте с цитированным возвратом, т. Е. '\r' , а не только \r . Целая строка:

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

И посмотрите, почему printf лучше, чем эхо?

Я не думаю, что вы используете bash потому что оба флага -n и -e обычно понимаются утилитой echo bash .

Убедитесь, что вы запустили скрипт, явно указав bash в качестве интерпретатора,

 $ bash ./script.sh 

или, делая его исполняемым и запуская его,

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

Арифметические операции в скрипте также неверны (при вычислении percentile ). bash выполняет арифметические подстановки в $(( ... )) и арифметическую оценку в (( ... )) .

Вот альтернативная реализация:

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