Мой sh - это bash. Мне нужен индикатор прогресса для моего цикла 0 ~ 9999 'for' ... Поэтому я использую эти строки внутри цикла, но вывод очень странный.
#!/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
...
Bash просто не распознал параметр '-ne' и экранированный '\ r 'для команды' echo ', что мне делать, чтобы решить эту проблему?
Если вам нужно использовать ] echo
, затем попробуйте использовать return в кавычках, то есть '\ r'
, а не только \ r
. Вся строка выглядит следующим образом:
echo -ne $((($i+1)/100))\%'\r'
И взгляните на Почему printf лучше, чем echo?
Я не думаю, что вы используете bash
, потому что оба параметра -n
и - Флаги e
обычно распознаются утилитой bash
echo
.
Убедитесь, что вы запускаете сценарий, явно указав bash
в качестве интерпретатора,
$ bash ./script.sh
или сделав его исполняемым и запустив его,
$ chmod +x ./script.sh
$ ./script.sh
Ваши арифметические операции в сценарии также неверны ( при вычислении процентиля
). bash
выполняет арифметические подстановки в $ ((...))
и арифметические вычисления в ((...))
.
Вот альтернативная реализация:
iter=70500
for(( i = 1; i <= iter; i++ )); do
if ! (( i % (iter/100) )); then
printf '\r%d%%' "$(( (100*i)/iter ))"
fi
done
echo