私の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