Ok...scheinbar bin ich jetzt der erste, der richtig an deinem Code rummeckern wird 😉
yes_no_question () { i=0 while [ $i = 0 ]; do echo -n "[j/n]: " read SAVE case "$SAVE" in [jJ]|[jJ][aA]) ANTWORT="JA" ;; [nN]|[nN][eE][iI][nN]) ANTWORT="NEIN" ;; *) echo "Frage bitte mit [ja] oder [nein] beantworten." && continue ;; esac i=1 done }
Das ist unschön. Mach's so:
proceed() { if (( $# > 0 )) then read -p "$*" else read -p "Möchten Sie fortfahren [J/n]? " fi if [[ "$REPLY" =~ ^[jJ][aA]?$|^$ ]] then return 0 else return 1 fi }
Statt dem
i=0 while [ $i = 0 ]; do
könntest du übrigens auch
while true
schreiben.
Grundsätzlich solltest du vermeiden, dass der Benutzer durch ein Skript zu interaktiv miteinbezogen wird. Deshalb sollte die Funktion nicht solange fragen, bis sie "ja" oder "nein" erhält, sondern besser bei allem, außer einem "ja" oder einem einfachen Enter, den Fehlercode 1 returnen. Dieser kann dann außerhalb der Funktion ausgewertet werden.
Beispiel:
if ! proceed "Möchten Sie fortfahren [J/n]? " then echo "Abbruch" exit fi
Verwende der Übersicht halber statt den Backticks `` lieber die Schreibweise $() (Oder kann die Sh das nicht?)
... eval stick_size=`fdisk -l | grep " $USBDEV" | cut -d" " -f3` ...
Warum "eval" ?
read_save_file () { n=1 while read line ; do eval "line$n=\"$line\"" n=`expr $n + 1` done < $SAVE_FILE USBDEV=$line1 SOURCEDIR=$line2 PERSISTENT=$line3 }
Nimm lieber ein array anstatt den Code mit solchen Sachen zu verhunzen 😉
install_pak () { echo "${CG}\nInstalliere nun fehlende Pakete.${CN}" apt-get -y install mbr syslinux mtools } makeboot () { echo "${CB}\nDer gesamte Vorgang kann einige Zeit in Anspruch nehmen und sollte keines Falls unterbrochen werden. \nBeginne...\n\n\n${CN}" sleep $long_time if dpkg-query -s syslinux 2>/dev/null|grep installed >/dev/null; then echo "${CG}Das Paket syslinux ist installiert.${CN}" else echo "${CR}Fehler: syslinux ist nicht installiert. Starte APT.${CN}" install_pak fi sleep $one_second if dpkg-query -s mtools 2>/dev/null|grep installed >/dev/null; then echo "${CG}Das Paket mtools ist installiert.${CN}" else echo "${CR}Fehler: mtools ist nicht installiert.. Starte APT.${CN}" install_pak fi sleep $one_second if dpkg-query -s mbr 2>/dev/null|grep installed >/dev/null; then echo "${CG}Das Paket mbr ist installiert.${CN}" sleep $one_second echo "${CB}Alle benötigten Pakete sind installiert.\n${CN}" else echo "${CR}Fehler: mbr ist nicht installiert. Starte APT.${CN}" install_pak fi sleep $one_second
Ich frag mich, was du machen würdest, wenn das Skript 10 Programme zur Ausführung benötigt 😲
Nimm die hier:
software_requirements() { for i in $@ do if ! which $i > /dev/null then required_software=$(echo ${required_software:-""} $i) fi done if [[ -n $required_software ]] then echo "Folgende Programme werden zur Ausführung des Skriptes benötigt:" for i in $required_software do echo " "$i done echo "Diese können nun installiert werden." if ! proceed then echo "Abbruch." exit 0 fi sudo apt-get install $required_software fi }
(Die Funktion "proceed()" ist hier direkt auch vorhanden)
Ausgerufen wird's dann zum Beispiel so:
software_requirements "vlc firefox epiphany"
Sooo...ich hoffe ich war nicht zu streng und hab nix übersehen 😉
Gruß Martin