Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在unix shell脚本中更改值输出_Unix - Fatal编程技术网

在unix shell脚本中更改值输出

在unix shell脚本中更改值输出,unix,Unix,我的脚本在WHILE循环中从头到尾逐行读取输入文件 假设输入文件中有100行 当我运行脚本时,说script.ksh 当从输入文件中读取1行时,它应该显示1%已完成。 从输入文件中读取2行时,已完成2%。 并在 我想在单行输出中,而不是在100行中,显示从1到100的完成百分比栏 100%完成。当脚本成功运行时 $value%已完成 此处,$value应根据单行中的进度从1更改为100 示例: in file ipfile.txt, I have 1 2 3 4 . . upto 100 co

我的脚本在WHILE循环中从头到尾逐行读取输入文件

假设输入文件中有100行

当我运行脚本时,说script.ksh

当从输入文件中读取1行时,它应该显示1%已完成。 从输入文件中读取2行时,已完成2%。 并在

我想在单行输出中,而不是在100行中,显示从1到100的完成百分比栏

100%完成。当脚本成功运行时

$value%已完成

此处,$value应根据单行中的进度从1更改为100

示例:

in file ipfile.txt, I have
1
2
3
4
.
.
upto
100

count=1
while read line
do
.......
.......
count=`expr $count + 1`
done<ipfile.txt

Here $count value will change from 1 to100.
when I will run the script,
output:
1 % completed. when $count=1
2 % completed. when $count=2
and show on upto 100 %.This completion status should be in single line output.
在ipfile.txt文件中,我有
1.
2.
3.
4.
.
.
最多
100
计数=1
读行时
做
.......
.......
count=`expr$count+1`
完成<代码>行数=1
读行时;做
printf“$(行数++)%%已完成\r”;
...
完成<输入文件

如果你有
seq
命令,你可以用这样的脚本来模拟你想要的。在本例中,
sleep 1
表示对输入行的处理

for i in $(seq 1 100)
do echo -e -n "\r$i% completed"; sleep 1
done
echo
-e
打开转义,例如
\r
(回车);
-n
会抑制
回音结尾的换行符。请注意,回车符位于行的开头;这意味着光标停留在输出的末尾,而不是数字所在的位置,这样看起来更好。您可能更喜欢使用
printf
命令而不是
echo
;它可能更可靠。(此代码使用bash 3.2进行了测试。)

如果你在读行,你必须用shell算法计算自己完成的百分比。如果文件中的行数不是100,则需要相应地缩放值


一般来说,这太像艰苦的工作了,不值得花时间去做正确的事情。

您需要阅读ansi转义序列,并使用它们来操纵终端位置

你试过什么?谢谢乔纳森的回复,我相信你理解我的问题。在这里,我专注于脚本运行的时间。假设我的脚本应该运行10秒。那么它应该在5秒时显示50%的完成率。如果我将睡眠值设置为最低值,它会被解决吗?忽略上面的评论。我明白了。没有线索-但我们都有一个!:(
for i in $(seq 1 100)
do echo -e -n "\r$i% completed"; sleep 1
done
echo