쉘 스크립트 파일에서 에코 옵션을 사용할 수 없습니다

쉘 스크립트 파일에서 에코 옵션을 사용할 수 없습니다

내 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" 옵션과 "echo" 명령에 대해 이스케이프된 "\r"을 인식하지 못합니다. 이 문제를 해결하려면 어떻게 해야 합니까?

답변1

을 사용해야 한다면 echo인용된 반환을 사용해 보세요. 즉 '\r', \r. 그러면 전체 줄은 다음과 같습니다.

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

보세요왜 printf가 echo보다 나은가요?

답변2

나는 당신이 그것을 사용하고 있다고 생각하지 않습니다. bash왜냐하면 -nthe 및 플래그는 일반적으로 의 유틸리티에 의해 이해되기 때문입니다 -e.bashecho

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

관련 정보