linux 在bash中睡眠时显示进度

e37o9pze  于 2022-12-11  发布在  Linux
关注(0)|答案(4)|浏览(129)

我写了一个简单的脚本,它必须在用户等待的时候显示进度。但是我得到了不定式循环,似乎睡眠不工作。这段代码有什么错?

#!/bin/bash

spinner=(
"Working    "
"Working.   "
"Working..  "
"Working... "
"Working...."
)

while sleep 10 
  do
    for item in ${spinner[*]}
      do
        echo -en "\r$item"
        sleep .1
        echo -en "\r              \r"
      done
  done
bejyjqdl

bejyjqdl1#

一个想法:

  • 使用bash(系统)变数SECONDS测量10秒
  • 使用tput代码来重写行
  • 删除spinner[]数组(因为值的唯一差异是尾随周期数)
EraseToEOL=$(tput el)
max=$((SECONDS + 10))              # add 10 seconds to current count

while [ $SECONDS -le ${max} ]
do
    msg='Waiting'
    for i in {1..5}
    do
        printf "%s" "${msg}"
        msg='.'
        sleep .1
    done
    printf "\r${EraseToEOL}"
done
printf "\n"

使用max/SECONDS方法对OP的当前代码进行了一个小的更改:

spinner=(
"Working    "
"Working.   "
"Working..  "
"Working... "
"Working...."
)

max=$((SECONDS + 10))

while [[ ${SECONDS} -le ${max} ]]
do
    for item in ${spinner[*]}
    do
        echo -en "\r$item"
        sleep .1
        echo -en "\r              \r"
    done
done
cpjpxq1n

cpjpxq1n2#

使用in/decrement变量i输出数组...

#!/bin/bash

countdown(){
spinner=(
"Working    "
"Working.   "
"Working..  "
"Working... "
"Working...."
)

i=4

if [ ${i} -lt 5 ]
then
 while true
  do
   for i in ${i}
    do
     printf "%s    \t" ${spinner[i]}
     sleep .1
     printf "\r"
     sleep .1
     if [ ${i} -eq 0 ]
      then
       # Here you can clean up or do what to do at zero count
       printf "\n"
       unset i
       unset spinner
       return 0 # Can be used in ${?} from parent bash
     else
      i=$((${i}-1))
    fi
  done
 done
return 1 # Should never be executed
fi
}

# A funny cd ;-)
cd(){
countdown && printf "%s\n" "DONE changing to "${1} # Gives out if return is 0 (${?})
unset cd
cd ${1}
}
#
cd ~
toiithl6

toiithl63#

我在bash中睡觉时显示进度的方法:

sleep 5 | pv -t

可能再简单不过了:)

相关问题