내 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'
답변2
나는 당신이 그것을 사용하고 있다고 생각하지 않습니다. bash
왜냐하면 -n
the 및 플래그는 일반적으로 의 유틸리티에 의해 이해되기 때문입니다 -e
.bash
echo
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