无法在 shell 脚本文件中使用 echo 选项

无法在 shell 脚本文件中使用 echo 选项

我的 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,请尝试使用带引号的 return ,即'\r',而不仅仅是\r。那么整行是:

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

看看为什么 printf 比 echo 更好?

答案2

我认为您没有使用,bash因为-n和标志通常都可以被's实用程序-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

相关内容