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.