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

Мой 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 ', что мне делать, чтобы решить эту проблему?

0
13.02.2017, 06:11
2 ответа

Если вам нужно использовать ] echo , затем попробуйте использовать return в кавычках, то есть '\ r' , а не только \ r . Вся строка выглядит следующим образом:

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

И взгляните на Почему printf лучше, чем echo?

1
28.01.2020, 02:34

Я не думаю, что вы используете 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
1
28.01.2020, 02:34

Теги

Похожие вопросы