Bei interaktiven Scripten sollten die Scripte dem Anwender immer eine Rückmeldung geben, ob sie gerade noch arbeiten.
Auf die Schnelle programmierte Schleifen neigen jedoch dazu ggf. lange zu laufen und dem Anwender keine Rückmeldung zu geben. Aus diesem Grund möchte ich nachfolgend zwei Möglichkeiten vorstellen, wie in Schleifen eine Rückmeldung erfolgen kann.
Progressbar
Progress : [#---------------------------------------] 3% (1406/45045)
Die Progressbar besteht aus einer Funktion, die den Fortschritt ausgibt.
function progressbar { ####################################### # Display a progress bar # Arguments: # $1 Current loop number # $2 max. no of loops (1005) # Returns: # None ####################################### # Process data let _progress=(${1}*100/${2}*100)/100 let _done=(${_progress}*4)/10 let _left=40-$_done # Build progressbar string lengths _fill=$(printf "%${_done}s") _empty=$(printf "%${_left}s") # 1.2 Build progressbar strings and print the progressbar line # 1.2.1 Output example: # 1.2.1.1 Progress : [########################################] 100% printf "\rProgress : [${_fill// /#}${_empty// /-}] ${_progress}%% ($1/$2)" }
Um die Progressbar darzustellen, muss ein Zähler (_start) und der Maximalwert (_end) definiert werden.
_start=0 _end=$(wc -l $1)
Anschließend kann pro Schleifendurchlauf der Fortschitt dargestellt werden.
let _start=_start+1 progressbar ${_start} ${_end}
Quelle: http://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script
Spinning Wheel
Das Spinning Wheel kann verwendet werden, anzuzeigen, dass ein Prozess in einer Subshell läuft.
Restarting DNS Service [\]
Dazu gibt es zwei Funktionen:
– spinner() gibt den Spinner aus, solange der angegebene Prozess existiert.
spinner() { local pid=$1 local delay=0.50 local spinstr='/-\|' while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do local temp=${spinstr#?} printf " [%c] " "${spinstr}" local spinstr=${temp}${spinstr%"$temp"} sleep ${delay} printf "\b\b\b\b\b\b" done printf " \b\b\b\b" }
– call_spinner() gibt eine Meldung und initiiert den spinner.
function call_spinner() { echo -n "${2}" spinner $! }
Der Aufruf des Spinners selber erfolgt über die Funktion call_spinner() mit der ID des zu überwachenden Prozesses und der anzuzeigenden Meldung.
tar cfv.... & call_spinner "${!}""Restarting DNS Service"
Quelle: http://fitnr.com/showing-a-bash-spinner.html
Spinner mit Start- und Stop-Funktion: https://github.com/tlatsas/bash-spinner/blob/master/spinner.sh