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

    Leave A Reply