Anchor(faq34)

Can I do a spinner in Bash?

Sure.

    i=1
    sp="/-\|"
    echo -n ' '
    while true
    do
        printf "\b${sp:i++%${#sp}:1}"
    done

The theory here is that each time the loop iterates, it displays the next character in the sp string, wrapping around as it reaches the end (where i is the position of the current character to display and ${#sp} is the length of the sp string).

The \b string is replaced by a 'backspace' character. Alternatively, you could play with \r to go back to the beginning of the line.

If you want it to slow down, put a sleep command inside the loop (after the printf).

If you already have a loop which does a lot of work, you can call the following function at the beginning of each iteration in that loop to update the spinner every time an iteration of your loop begins:

sp="/-\|"
sc=0
spin() {
   printf "\b${sp:sc++:1}"
   ((sc==4)) && sc=0
}
endspin() {
   printf "\r%s\n" "$@"
}

until work_done; do
   spin

   some_work
done
endspin

A similar technique can be used to build progress bars.